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

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

Пример