Клаузула 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
, поэтому результаты запросов FROM ... FINAL
могут быть смещены при использовании PREWHERE
с полями, не входящими в раздел ORDER BY
таблицы.
Ограничения
PREWHERE
поддерживается только таблицами из семейства *MergeTree.