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)
の長所と短所を理解しようとしています。
ありがとう。
また、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が言ったように、それはすべてあなたがフィルタリングしているものに依存します。
sort_key
の順序は次のようになります
一般的なルール:同じレベルの場合、カーディナリティが低くなります。