跳到主要内容
跳到主要内容

PREWHERE 子句

PREWHERE 是一种优化,用于更有效地应用过滤条件。即使未显式指定 PREWHERE 子句,它也是默认启用的。它通过自动将部分 WHERE 条件移到预处理阶段来工作。PREWHERE 子句的作用仅在于控制此优化,如果您认为自己可以比默认情况做得更好。

通过预处理优化,首先仅读取执行预处理表达式所需的列。然后读取进行其余查询所需的其他列,但仅读取预处理表达式在某些行中为 true 的那些块。如果存在许多预处理表达式在所有行中为 false 的块,并且预处理所需的列少于查询其他部分所需的列,这通常允许从磁盘读取更少的数据以执行查询。

手动控制 PREWHERE

该子句的含义与 WHERE 子句相同。区别在于从表中读取哪些数据。当手动控制 PREWHERE 以过滤查询中少数列使用的条件,但提供强大的数据过滤时。这样可以减少读取的数据量。

查询可以同时指定 PREWHEREWHERE。在这种情况下,PREWHERE 的优先级高于 WHERE

如果 optimize_move_to_prewhere 设置为 0,则禁用从 WHERE 自动移动表达式部分到 PREWHERE 的启发式操作。

如果查询具有 FINAL 修饰符,则 PREWHERE 优化并不总是正确。如果要启用它,则必须同时开启设置 optimize_move_to_prewhereoptimize_move_to_prewhere_if_final

备注

PREWHERE 部分在 FINAL 之前执行,因此在使用不在表的 ORDER BY 部分的字段时,FROM ... FINAL 查询的结果可能会失真。

限制

PREWHERE 仅支持 *MergeTree 家族的表。

示例