Skip to main content
PREWHERE позволяет повысить эффективность фильтрации, сократив объём считываемых данных. По умолчанию ClickHouse применяет эту оптимизацию даже если запрос явно не содержит PREWHERE: подходящие условия из WHERE перемещаются в PREWHERE. Вы можете явно указать PREWHERE, чтобы контролировать, какие условия применяются на этом этапе. При использовании PREWHERE ClickHouse сначала считывает только столбцы, необходимые для вычисления условия. Затем остальные столбцы, требуемые запросом, считываются только для блоков, содержащих хотя бы одну подходящую строку. Это может сократить объём считываемых данных, если условие использует меньше столбцов, чем остальная часть запроса, и отфильтровывает множество блоков.

Ручное управление PREWHERE

Указывайте PREWHERE вручную, если условие ссылается на небольшое число столбцов и отфильтровывает много строк. Это позволяет сократить объём данных, считываемых из остальных столбцов. Запрос может содержать и PREWHERE, и WHERE. В этом случае PREWHERE вычисляется первым. Установите для optimize_move_to_prewhere значение 0, чтобы запретить ClickHouse автоматически перемещать условия из WHERE в PREWHERE. В запросах с модификатором FINAL ClickHouse перемещает условия из WHERE в PREWHERE, только если включены и optimize_move_to_prewhere, и optimize_move_to_prewhere_if_final.
По умолчанию PREWHERE вычисляется до FINAL, поэтому запросы FROM ... FINAL могут давать неожиданные результаты, если PREWHERE ссылается на столбцы, не входящие в ключ ORDER BY таблицы.

PREWHERE с JOIN

Условие PREWHERE в запросе с JOIN может напрямую ссылаться на столбцы только одной таблицы. ClickHouse применяет условие к строкам этой таблицы до их участия в JOIN. Напротив, условие WHERE логически фильтрует результат JOIN, хотя оптимизатор может применить его до JOIN, если это не изменит результат. Поэтому использование одного и того же условия в PREWHERE и WHERE может давать разные результаты, особенно при внешних JOIN. В следующем примере создаются две таблицы, чтобы продемонстрировать эту разницу:
В первом запросе PREWHERE фильтрует table_2 перед выполнением LEFT JOIN, поэтому для строки из table_1 с id = 1 не находится соответствия:
То же условие в предложении WHERE отфильтровывает результат JOIN, исключая строку с id = 1:

Ограничения

PREWHERE поддерживается только таблицами семейства *MergeTree.

Пример

Последнее изменение 14 августа 2026 г.