Перейти к основному содержимому
Перейти к основному содержимому

Клаузула 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.

Пример