PREWHERE 句
Prewhereはフィルタリングをより効率的に適用するための最適化です。PREWHERE
句が明示的に指定されていなくても、デフォルトで有効になっています。これは、WHERE条件の一部を自動的にprewhereステージに移動させることによって機能します。PREWHERE
句の役割は、デフォルトで発生する方法よりも効果的に制御すると考える場合に、この最適化を制御することです。
Prewhere最適化を使用すると、最初にprewhere式を実行するために必要なカラムだけが読み取られます。その後、クエリの残りの部分を実行するために必要な他のカラムが読み取られますが、prewhere式が少なくともいくつかの行に対してtrue
であるブロックのみが対象となります。prewhere式がすべての行に対してfalse
であるブロックが多数ある場合と、prewhereがクエリの他の部分に比べて必要なカラムが少ない場合、ディスクから読み取るデータ量が大幅に少なくなることがあります。
Prewhereの手動制御
この句はWHERE
句と同じ意味を持ちます。違いは、テーブルから読み取るデータです。クエリ内の少数のカラムで使用されるフィルタリング条件に対してPREWHERE
を手動で制御する場合、強力なデータフィルタリングを提供します。これにより、読み取るデータの量が減少します。
クエリは同時にPREWHERE
とWHERE
を指定することができます。この場合、PREWHERE
がWHERE
の前に来ます。
optimize_move_to_prewhere設定が0に設定されている場合、WHERE
からPREWHERE
への式の一部を自動的に移動するヒューリスティックは無効になります。
クエリにFINAL修飾子がある場合、PREWHERE
最適化は常に正しいとは限りません。これは、optimize_move_to_prewhereおよびoptimize_move_to_prewhere_if_finalの両方の設定がオンになっている場合のみ有効になります。
PREWHERE
セクションはFINAL
の前に実行されるため、ORDER BY
セクションにフィールドがない場合、FROM ... FINAL
クエリの結果が歪む可能性があります。
制限事項
PREWHERE
は、*MergeTreeファミリーのテーブルのみでサポートされています。