PREWHERE 子句
PREWHERE 是一种优化,用于更有效地应用过滤条件。即使未显式指定 PREWHERE
子句,它也是默认启用的。它通过自动将部分 WHERE 条件移到预处理阶段来工作。PREWHERE
子句的作用仅在于控制此优化,如果您认为自己可以比默认情况做得更好。
通过预处理优化,首先仅读取执行预处理表达式所需的列。然后读取进行其余查询所需的其他列,但仅读取预处理表达式在某些行中为 true
的那些块。如果存在许多预处理表达式在所有行中为 false
的块,并且预处理所需的列少于查询其他部分所需的列,这通常允许从磁盘读取更少的数据以执行查询。
手动控制 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
之前执行,因此在使用不在表的 ORDER BY
部分的字段时,FROM ... FINAL
查询的结果可能会失真。
限制
PREWHERE
仅支持 *MergeTree 家族的表。