概要(ここだけ読めば全部わかる)
Azureでデータ分析基盤といえば、DataFactory+SynapseAnalyticsの組み合わせかもしれません。
しかし、DataFactoryからSynapseAnalyticsにテーブルを作らせると自動的に分散方法がラウンドロビンになるのでパフォーマンスに注意してください。先にSynapseAnalyticsでテーブルを作っておきましょう。というだけの話です。
SynapseAnalyticsの分散方式
Synapse Analyticsでは、処理の並列化を支えるためにテーブルの分散方式を指定します。
主に以下の3種類があります:
分散方式 | 説明 |
---|---|
HASH | 指定した列の値に基づいて分散。結合や集計が高速になることが多い。 |
ROUND_ROBIN | 行を均等に分散。ロードは早いが、結合やフィルターでは遅くなる傾向。 |
ADF(DataFactory)でテーブルの自動作成をするとラウンドロビンになる。
ADFでデータのコピーアクティビティやデータフローアクティビティを使ってSynapseにデータをコピーする際、「ターゲットに存在しないテーブルは自動で作成」される機能がありますが、これは自動的に分散方式がラウンドロビンに固定されます。
ラウンドロビンのデメリット
- JOIN性能が悪い(Hash分散テーブル同士なら高速なのに…)
- クエリのスキャン効率が悪くなる
- データ量が増えると処理遅延が顕著に
解決策:テーブルは事前に作っておく
最も確実なのは、Synapse側で事前にCREATE TABLEしておくことです。ADFの「テーブルの作成」機能は非常に便利なのですが、パフォーマンスを考慮した場合、ハッシュ分散にしたい!ということがあります。その場合はSynapse側でCREATE TABLEしておき、ADFにはテーブルの作成・再作成は行わせないということが重要です。(データフローのSinkで「テーブルの再作成」をさせるとまたラウンドロビンになってしまいますので注意です。)
まとめ
- ADFで自動作成されるテーブルは「ROUND_ROBIN分散」
- JOINやクエリ性能に悪影響を与える可能性あり
- パフォーマンスを意識するなら、テーブルは事前にSynapseで作成しておくのが良い
- テーブル設計は「あとからやる」ではなく「最初にちゃんとやる」が吉
ちょっとした落とし穴ですが、知っているだけで劇的にパフォーマンスを改善出来ます。
これからADF+Synapseを触る方の参考になればうれしいです。