Предложение 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.