ファクトテーブルには通常、粒度を定義するすべてのディメンションのキーで構成される複合主キーが含まれています。このキーでテーブルを配布する場合、それらのテーブルはファクト用に生成されたハッシュと一致しない独自のPKによって配布されるため、バインドされているディメンションへのローカル結合を実行できない可能性があります。
寸法が小さい場合はそれほど重要ではないと思いますが、寸法が大きい場合は、数百万のCUSIPおよびその他の識別子を含むセキュリティマスターテーブルの場合、ローカル結合をどのように実行できますか?
事実の配布キーを選択するための標準的なアプローチは何ですか?
セキュリティディメンションが最大の場合は、セキュリティディメンションキーでファクトテーブルを配布します。大きいので、スキューを防ぐためにそれ自体で十分なエントロピーを持っている必要があります。
一方、これを実行したくない場合の1つの状況は、WHERE句でセキュリティディメンションを頻繁に選択し、多数のファクトを取得または処理する場合です。これにより、すべての処理が1つのノードにロードされます。十分に大きいものがある場合は別のディメンションキー、別のディメンションとの複合キー、または単にランダムな分布を使用するかのいずれかになります。
一方、このようなクエリを常に多数実行している場合は、ノード全体でワークロードをスキューすることは問題にならない可能性があります。ノードはすべて、独自のクエリでローカル結合を実行するのに忙しいためです。負荷分散の。私はこれが提案されているのを見ましたが、私自身はあまり好きではありません。
複合主キーによる分散アプローチでは、スキューが少ないかまったくない分布が作成されます。それは素晴らしいことですが、ご指摘のとおり、他の分野ではいくらかのコストが伴います。実際には、配布さえも二次的な関心事であることがよくあります。分散は、最も一般的に使用される結合または最も一般的な集約による傾向があります。あなたがこれを説明する場合、これはセキュリティ記述子の次元であるように聞こえます。
MPPデータベースでのデータ分散は、データの移動を最小限に抑えることと、クラスターで使用可能なすべてのハードウェアパフォーマンスを利用することの2つのメトリックを最適化することを目的としています。データの動きを最小限に抑えるには、大規模な結合操作と集計操作のデータを同じ場所に配置します。すべてのハードウェアを使用してクエリの最高のパフォーマンスを得るには、データが均等に分散されている必要がありますおよび通常のクエリは単一ノードのデータでは機能しません。したがって、データモーションの分散を最小化するために分散キーを選択するときは、スキューを最小化するだけでなく、クエリ述語で一般的に使用されるフィールドによる分散を回避することも重要です。
セグメント間のタプルの動きを削除したい場合など、分布を決定する方法はたくさんあります。
さまざまな列(自然キー、代理キー、代理キー、またはさまざまなDIMの自然キーを含む)を持つテーブルファクトを想定するファクトテーブル-> fct_sk、dim1_sk、dim2_sk、dim3_sk
また、独自の代理キーが設定された3つのDIMがあります。dim1_sk、dim2_sk、dim3_sk、これらの代理キーは、上記のファクトテーブルで参照されています。
シナリオ(1)
すべてのテーブルの代理キーが配布キーとして使用されます
上記のシナリオでは、すべてのテーブルのデータがセグメント間で適切に分散されますが、結合の場合、多くのモーションが実行されます
シナリオ(2)
dIMテーブルのデータは代理キー(dim1_skのDIM1とdim2_skのDIM2およびdim3_skのDIM3)で配布する必要があり、ファクトテーブルはすべてのDIMのSK(dim1_sk、dim2_sk、dim3_sk)の複合配布キーで配布する必要があります。
上記のシナリオでは、データが歪んでいる可能性がありますが、JOINタプルが1つのセグメントインスタンスから別のインスタンスに移動する必要がない場合、これらの方法でローカル結合が実現されます。
シナリオ(3)
より大きなDIMは、skに基づいて配布でき、ファクトも同じように配布されるため、これらの結合では、ローカル結合操作が実行され、サイズが小さい場合は他のDIMがブロードキャストされます。
よろしく