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.