从 TPCH 测试学习性能优化技巧之 Q19
一、查询要求
Q19语句查询得到对一些空运或人工运输零件三个不同种类的所有订单的总折扣收入 。 零件的选择考虑特定品牌、包装和尺寸范围 。
Q19语句的特点是:带有聚集、IN子查询操作并存的三表连接操作 。
二、Oracle执行
Oracle编写的查询SQL语句如下:
select/*+parallel(n)*/
sum(l_extendedprice*(1-l_discount))asrevenue
from
lineitem,part
where
(
p_partkey=l_partkey
andp_brand='Brand#32'
andp_containerin('SMCASE','SMBOX','SMPACK','SMPKG')
【从 TPCH 测试学习性能优化技巧之 Q19】andl_quantity>=7andl_quantity<=7+10
andp_sizebetween1and5
andl_shipmodein('AIR','AIRREG')
andl_shipinstruct='DELIVERINPERSON'
)
or
(
p_partkey=l_partkey
andp_brand='Brand#23'
andp_containerin('MEDBAG','MEDBOX','MEDPKG','MEDPACK')
andl_quantity>=18andl_quantity<=18+10
andp_sizebetween1and10
andl_shipmodein('AIR','AIRREG')
andl_shipinstruct='DELIVERINPERSON'
)
or
(
p_partkey=l_partkey
andp_brand='Brand#45'
andp_containerin('LGCASE','LGBOX','LGPACK','LGPKG')
andl_quantity>=22andl_quantity<=22+10
andp_sizebetween1and15
andl_shipmodein('AIR','AIRREG')
andl_shipinstruct='DELIVERINPERSON'
);
其中/*+parallel(n)*/是Oracle的并行查询语法 , n是并行数 。
脚本执行时间 , 单位:秒

文章图片
三、SPL优化
本查询是个两表连接的过滤查询 , 结构上比较简单 , 但是过滤条件比较复杂 。 我们注意到 , 条件表达式中有不少项只与较小的表part相关 , 而且这些项的计算复杂度还较高(有in运算) , 如果先针对part表把这些项计算出来 , 则计算量将比针对两表连接结果集再计算要少得多 , 因为连续结果集是和lineitem表规模相同 , 要大得多 。
SPL脚本如下:

文章图片
A13在part表中新产生一个flag字段 , 用于将part相关的复杂条件项先计算出来 。 当记录满足SQL中的or条件1、2、3时分别赋值为1、2、3 , 都不满足则赋值0 , 然后用flag值是否大于0来过滤 。 在A15中再根据flag的值来选择用哪个quantity值对L_QUANTITY进行过滤 。 flag相关的复杂计算式只需要计算part表的行数次 。
脚本执行时间 , 单位:秒

文章图片
推荐阅读
- 颠覆未来战场?美军成功测试新武器,但中国早用来砍树了
- 路虎库存成灾,从68万降到45万仍无人问津,经销商:给钱就卖!
- 央视新闻客户端这条传播链从1到200才两周!恐怖的投币练歌房:唱5首歌飞沫遍身
- 粤港澳大湾区战略呼唤网红经济助力
- 从24号开始,佳音上门,好运连连,事业顺风顺水的4个星座
- 为扳倒汉兰达,这豪车拼了,从32万降到26万,起步2.0T爆241马力
- 3艘宙斯盾舰逼近领海,委内瑞拉不再放狠话,2艘幽灵从港口消失
- 约旦海岸线26公里,一部分从沙特交换来,付出多大代价?
- 中美蜜月期下的暗战,从超-7战斗机立项到下马背后鲜为人知的博弈
- 千里护送认亲!聊城聋哑老人走失12年从湖北归来团聚
