3

テーブルを作成するときに、分散で複数の列を使用する利点はありますか?例えば:

CREATE TABLE data_facts (
    data_id int primary key,
    channel_id smallint,
    chart_id smallint,
    demo_id smallint,
    value numeric)
DISTRIBUTED BY (
    channel_id,
    chart_id,
    demo_id)

data_factsチャンスがあるので、3つの異なるテーブルと結合し、それぞれchannelchartdemo使用する必要があります。channel_idchart_iddemo_id

具体的には、

  1. 効率の観点から、参加に使用しているものをすべて追加distributionして含める必要がありますか?id(s)
  2. もしそうなら、これらの順序はid(s)重要ですか?
  3. これはアーキテクチャレベルでどのように機能しますか?(オプション)

ありがとう!

4

2 に答える 2

2

データベースをシャーディングする量と、各パーティションに分散するレコードの数によって異なります。つまり、分散に複数の列を追加すると、より多くのデータがより多くのパーティションにフラグメント化されます。

また、モジュロまたはハッシュのどちらでシャーディングするかによっても異なります...

ただし、私の意見では、複数の列の主キーがあり、この主キーでシャーディングする場合は、複数の列(主キーのすべての列を含む)で分散する意味があります。それ以外の場合は、単一の列でシャーディングする必要があります。ほとんどの場合、十分です。

于 2012-09-23T07:36:09.430 に答える
0

いいえ。複数のハッシュキーは、ハッシュ分散を実行していて、単一のキーが合理的に均等な分散を提供しない場合を除いて、利点を提供しません。

同じ場所に配置された結合は、次の条件下で発生します。

  • 等結合です(キー=キー)
  • すべての分布列が結合で使用されます。

両方の条件が満たされない場合、テーブルの1つがすべてのコンピューティングノードにブロードキャストされ、パフォーマンスの問題が発生し、クエリが失敗することがあります。

分散を使用することの実用性は、モデリング手法と大きく関係しています。スタースキーマでは、3NF構造よりも効果的です。スタースキーマでは、最大のディメンションテーブルのキーにファクトを配布するのが一般的です。そのディメンションに参加すると、コロケーションが発生します。これは最も時間のかかる参加になるため、最大のメリットがあります。通常、(クエリ内の)小さいディメンションテーブルはブロードキャストされ、結合のためにメモリに保持されます。

于 2021-07-25T22:44:44.823 に答える