メインコンテンツまでスキップ
メインコンテンツまでスキップ

PREWHERE 句

Prewhereはフィルタリングをより効率的に適用するための最適化です。PREWHERE句が明示的に指定されていなくても、デフォルトで有効になっています。これは、WHERE条件の一部を自動的にprewhereステージに移動させることによって機能します。PREWHERE句の役割は、デフォルトで発生する方法よりも効果的に制御すると考える場合に、この最適化を制御することです。

Prewhere最適化を使用すると、最初にprewhere式を実行するために必要なカラムだけが読み取られます。その後、クエリの残りの部分を実行するために必要な他のカラムが読み取られますが、prewhere式が少なくともいくつかの行に対してtrueであるブロックのみが対象となります。prewhere式がすべての行に対してfalseであるブロックが多数ある場合と、prewhereがクエリの他の部分に比べて必要なカラムが少ない場合、ディスクから読み取るデータ量が大幅に少なくなることがあります。

Prewhereの手動制御

この句はWHERE句と同じ意味を持ちます。違いは、テーブルから読み取るデータです。クエリ内の少数のカラムで使用されるフィルタリング条件に対してPREWHEREを手動で制御する場合、強力なデータフィルタリングを提供します。これにより、読み取るデータの量が減少します。

クエリは同時にPREWHEREWHEREを指定することができます。この場合、PREWHEREWHEREの前に来ます。

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ファミリーのテーブルのみでサポートされています。