5

Redshift は、条件 A= を持つクエリの列 A で並べ替えられたテーブルのブロックを効率的に (つまり、バイナリ検索で) 見つけますか?

例として、フィールド A に分散およびソートされた、最大 5 億行、最大 50 フィールドのテーブル T があるとします。 T: 値ごとに最大 100 行。
単一の XL ノードを持つ redshift クラスターを想定します。
フィールド A は圧縮されません。ANALYZE COMPRESSION で提案されているように、他のすべてのフィールドには何らかのフォーム圧縮があります。圧縮されていないテーブルと比較して、1:20 の比率が指定されました。

簡単なクエリが与えられた場合:

select avg(B),avg(C) from
(select B,C from T where A = <val>)

VACUUM と ANALYZE の後、次の説明プランが提供されます。

XN Aggregate (cost=1.73..1.73 rows=1 width=8)
-> XN Seq Scan on T (cost=0.00..1.23 rows=99 width=8)
Filter: (A = <val>::numeric)

このクエリが完了するまでに 39 秒かかります。
主な質問は次のとおりです。これは赤方偏移の予想される動作ですか?

最適なソートキーの選択のドキュメントによると、
「1 つの列で頻繁に範囲フィルタリングまたは等価フィルタリングを行う場合は、その列をソートキーとして指定します。Redshiftは、最小値を追跡するため、その列のデータブロック全体の読み取りをスキップできます。各ブロックに格納されている列の最大値と、述語範囲に適用されないブロックをスキップできます。

ソートキーの選択: 「ソートされたデータに依存するもう 1 つの最適化は
、範囲制限された述語の効率的な処理です。Amazon Redshift は、列データを 1 MB のディスク ブロックに格納します。各ブロックの最小値と最大値は、メタデータの一部として格納されます。 If range-restricted column is a sort key, the query processor is able to use the min and max values to immediately skip over large numbers of blocks during table scans. たとえば、テーブルに日付で並べ替えられた 5 年間のデータが格納されている場合、クエリで 1 か月の日付範囲を指定すると、最大 98% のディスク ブロックをスキャンから除外できます. データが並べ替えられていない場合は、より多くのディスク ブロック (おそらくすべて) をスキャンする必要があります.これらの最適化に関する情報については、配布キーの選択を参照してください。 "

二次的な質問:
ソート キーでの前述のスキッピング スキャンの複雑さは何ですか? それは線形 ( O(n) ) ですか、それとも二分探索 ( O(logn) ) の変形ですか?
キーがソートされている場合 - 利用可能な唯一の最適化をスキップしていますか?
説明計画では、この「スキップ」最適化はどのように見えるでしょうか?
上記の説明は、このクエリで可能な最良の説明ですか?
このシナリオを考えると、赤方偏移が提供することが期待できる最速の結果は何ですか?
このユース ケースでは、バニラの ParAccel は異なる動作をしますか?

4

1 に答える 1

2

この質問は、Amazon フォーラムで回答されています: https://forums.aws.amazon.com/thread.jspa?threadID=137610

于 2013-10-28T09:37:45.710 に答える