私は大きな時間範囲にわたる大量の瞬間的なデータを格納する赤方偏移テーブルを設計しています。私は2つのクエリpattensに基づいてソート・キーを選択するに取り組んでいます複合基準(時間範囲+列一致)のための最良の赤方偏移化合物のソートキー
CREATE TABLE analytics (
user_id VARCHAR(30),
ts TIMESTAMPTZ,
)
diststyle even;
:
# 1: select a bounded time range of recent data for a client (high perf priority)
SELECT * FROM analytics WHERE user_id = foo and ts > month_start and ts <= month_end;
# 2: select all events for a client (can be slower):
SELECT * FROM analytics WHERE user_id = foo;
私はソート・キーを決定し、いずれかを検討している
関連するスキーマは次のようになります:
オプション1:
sortkey(user_id, ts);
オプション2:
sortkey(ts, user_id);
オプション3:
interleaved sortkey (ts, user_id);
オプション1は、両方のクエリを支援CLIENT_ID最初の利点を有します。しかし、時間ベースのクエリーパターンでは最初にクエリーを行うほうが時間的なクエリーパターンのほうが最適と思われ、データを細かくスライスすることができるため、オプション2が優れている可能性があります。最後に、Iオプション3では、2つのユースケースを均等にバランスさせることができます。
私の質問は以下のとおりです。
- がどのようにオプション1とオプション2は、ユースケース#1のための賢明なパフォーマンスを比較しますか?
- インタリーブされたインデックスはここで意味がありますか?ユーザーケース#1の複合インデックス作成とはどのように比較されますか?増加した負荷時間が心配です。
ここに掲載されているパフォーマンスに関するその他のご意見をお待ちしております。 Amazonのドキュメントを読んでも、ここで相対的なパフォーマンスのトレードオフを理解するのに十分な文脈は与えられませんでした。
ありがとうございました。私たちは明示的に削除することを選択しました DISTKEY(user_id) しかし間違いかもしれません。私たちの考えは、一部の大規模なクライアントがイベントデータの大半を占めており、それらを1つのノードに(分割するのではなく)集中させると、処理が遅くなります。ユーザーあたりのアナリティクスの数がユーザーごとに大きく異なる場合でも、アプローチはまだ理にかなっていますか? – segfaultDC5
@ segfaultdc5それはそれがいかに塊であるかによって異なります。 Distキーは非常に重要なので、それを適所に置くためにかなりの歪みを許容する必要があります。大量の*(〜50%)の場合は 'EVEN'を使いますが、結合されたテーブルを' ALL'にし、ソートキーの第1列として 'user_id'を追加する必要があります。このビューでは、テーブルの歪度を評価できます。https://github.com/awslabs/amazon-redshift-utils/blob/8748d3d108a332b4712b8a91c0630dfc377f1ae9/src/AdminViews/v_extended_table_info.sql –