PREWHERE no se especifique explícitamente. Funciona moviendo automáticamente parte de la condición WHERE a la etapa de prewhere. La función de la cláusula PREWHERE es únicamente controlar esta optimización si cree que sabe hacerlo mejor que como ocurre de forma predeterminada.
Con la optimización de prewhere, primero solo se leen las columnas necesarias para ejecutar la expresión de prewhere. Después, se leen las demás columnas necesarias para ejecutar el resto de la consulta, pero solo en aquellos bloques en los que la expresión de prewhere es true al menos para algunas filas. Si hay muchos bloques en los que la expresión de prewhere es false para todas las filas y prewhere necesita menos columnas que otras partes de la consulta, esto a menudo permite leer muchos menos datos del disco para ejecutar la consulta.
Control de PREWHERE manualmente
WHERE. La diferencia está en qué datos se leen de la tabla. Cuando se controla manualmente PREWHERE para condiciones de filtrado que se usan en una minoría de las columnas de la consulta, pero que ofrecen un filtrado de datos eficaz, se reduce el volumen de datos que se debe leer.
Una consulta puede especificar PREWHERE y WHERE simultáneamente. En este caso, PREWHERE precede a WHERE.
Si la configuración optimize_move_to_prewhere está establecida en 0, se desactivan las heurísticas que mueven automáticamente partes de las expresiones de WHERE a PREWHERE.
Si la consulta tiene el modificador FINAL, la optimización de PREWHERE no siempre es correcta. Solo se habilita si ambas configuraciones optimize_move_to_prewhere y optimize_move_to_prewhere_if_final están activadas.
La sección
PREWHERE se ejecuta antes de FINAL, por lo que los resultados de las consultas FROM ... FINAL pueden verse sesgados al usar PREWHERE con campos que no están en la sección ORDER BY de una tabla.Limitaciones
PREWHERE solo se admite en tablas de la familia *MergeTree.