一. 谓词含有不确定性结果算子的时候谓词不会被下推
如果谓词含有rand,random,shuffle,uuid等不确定结果的算子的时候,Presto不会将谓词下推。
比如“SELECT * FROM ( SELECT custkey, orderkey, rank() OVER (PARTITION BY custkey ORDER BY orderdate ASC) FROM orders ) WHERE custkey > 100*rand()”
如果对WHERE custkey > 100*rand()进行下推,在处理每条数据时候,每条数据产生的rand()值都不一样,因此每条数据是否保留的条件也不一样,可能会出现同样的custkey 值部分被保留,部分不会被保留的紊乱结果,而且与sql的原意扫描全表,然后按照custkey 分区,保留部分分区的数据也不符合,因此在Presto中,谓词出现不确定性结果的算子的时候,谓词过滤条件不会被下推。
二. 谓词中含有聚合算子且聚合算子出现不止一次的时候,谓词不会被下推。
如:
WITH t AS (SELECT orderkey * 2 x FROM orders2) SELECT * FROM t WHERE x + x > 1 中x + x > 1不会被下推
WITH t AS (SELECT orderkey * 2 x FROM orders2) SELECT * FROM t WHERE x > 1 中的x > 1会被下推。
本文介绍了Presto查询引擎在处理含有不确定结果算子(如rand())和多次聚合运算的谓词时,为何不会执行谓词下推的策略。这种行为旨在避免因随机性和多次聚合导致的数据处理混乱,确保查询结果的正确性。同时,文章通过示例解释了谓词下推在不同情况下的应用和限制,帮助理解查询优化的原理。
474

被折叠的 条评论
为什么被折叠?



