Presto中谓词不会被下推的情形

本文介绍了Presto查询引擎在处理含有不确定结果算子(如rand())和多次聚合运算的谓词时,为何不会执行谓词下推的策略。这种行为旨在避免因随机性和多次聚合导致的数据处理混乱,确保查询结果的正确性。同时,文章通过示例解释了谓词下推在不同情况下的应用和限制,帮助理解查询优化的原理。

一. 谓词含有不确定性结果算子的时候谓词不会被下推

如果谓词含有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会被下推。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值