web-dev-qa-db-ja.com

複数のソートキー列があるとはどういう意味ですか?

Redshiftでは、複数の列をSORTKEY列として指定できますが、ベストプラクティスのドキュメントのほとんどは、SORTKEYが1つしかないかのように記述されています。

SORTKEY (COL1, COL2)を使用してテーブルを作成した場合、それはすべての列がCOL1、次にCOL2でソートされて格納されることを意味しますか?または、列指向ストアであるため、各列は異なる順序で格納されますか?つまりCOL1はCOL1の順序で、COL2はCOL2の順序で、他の列は順序付けられていませんか?

私の状況では、(とりわけ)type_idとタイムスタンプ列を持つテーブルがあります。データはおおよそタイムスタンプ順に到着します。ほとんどのクエリは、type_idとtimestampの両方に対して結合/制限されます。通常、type_id句はより具体的です。つまり、timestamp句を確認するよりも、type_id句を確認する方が、はるかに多くの割合の行を除外できます。このため、type_idはDISTKEYです。 SORTKEY (type_id)SORTKEY (stamp)SORTKEY (type_id,stamp)SORTKEY (stamp,type_id)の長所と短所を理解しようとしています。

ありがとう。

27
Lorrin

また、Redshiftを使用しており、約20億のレコード(毎日+2,000万)があります。sort_keyの選択性が低いほど、sort_keyリストの上位にある必要があります。

私たちの場合(そして、あなた自身のデータをどのように使用/クエリするかを分析することをお勧めします)、最初のsort_keyとしてタイムスタンプを使用しました。これに伴う問題は、1秒以内でも約200行を記録するため、1MBブロックには数秒しか含まれず、すべてのタイプのデータがその単一ブロックに含まれることです。つまり、タイムスタンプは非常に選択的ですが、すべてのブロックにすべての種類のデータがあるため、これ以上フィルタリングすることはできません。

最近、sort_keysの順序を逆にしました。最初の値には約15の異なる値があり、2番目の値には約30の値があり、タイムスタンプは現在最後の値ですが、それでも1つのブロックは秒単位で測定されます。

これにより、(最初の2つのsort_keysをフィルターとして頻繁に使用するため)次のようになります。古い解決策:1年のデータ、1か月を選択すると、ブロックの91%が削除されますが、すべてのブロックを開く必要があります。さらにフィルタリングしたいのですが。

新しいソリューションは、日付範囲に関係なく、最初のステップでブロックの約14/15を削除し、次に残りのブロックの約95%を削除し、タイムスタンプは残りのブロックの91%を削除します。

ソートキーの順序を除いて同じである2つの8億レコードテーブルで徹底的にテストしました。 'where'句の期間が長いほど、より良い結果が得られました。明らかに結合の場合、それはさらに重要になりました。

したがって、私の提案は、データベースと頻繁に実行するクエリの種類を知っていることです。最も選択的な列が最初のsort_keyとして最適ではない可能性があるためです。 Enno Shiojiが言ったように、それはすべてあなたがフィルタリングしているものに依存します。

15
user318581

sort_keyの順序は次のようになります

  1. 遠方にいるものを考慮し、フィルタリングして最初に参加
  2. フィルタ内のものを考慮し、参加します
  3. フィルタ内のものを考慮してください
  4. 参加している人を考慮してください
  5. group by、order by(ウィンドウ関数を含む)のそれらを考慮してください

一般的なルール:同じレベルの場合、カーディナリティが低くなります。

3
elawcn