##从 TPCH 测试学习性能优化技巧之 Q19
一、 查询要求
Q19语句查询得到对一些空运或人工运输零件三个不同种类的所有订单的总折扣收入 。 零件的选择考虑特定品牌、包装和尺寸范围 。
Q19语句的特点是:带有聚集、IN子查询操作并存的三表连接操作 。
二、 Oracle执行
Oracle编写的查询SQL语句如下:
select /*+ parallel(n) */
sum(l_extendedprice * (1 - l_discount)) as revenue
from
lineitem,part
where
(
p_partkey = l_partkey
and p_brand = 'Brand#32'
and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG')
and l_quantity >= 7 and l_quantity <= 7 + 10
and p_size between 1 and 5
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)
or
(
p_partkey = l_partkey
and p_brand = 'Brand#23'
and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK')
and l_quantity >= 18 and l_quantity <= 18 + 10
and p_size between 1 and 10
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
)
or
(
p_partkey = l_partkey
and p_brand = 'Brand#45'
and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG')
and l_quantity >= 22 and l_quantity <= 22 + 10
and p_size between 1 and 15
and l_shipmode in ('AIR', 'AIR REG')
and l_shipinstruct = 'DELIVER IN PERSON'
);
其中/*+ parallel(n) */ 是Oracle的并行查询语法 , n是并行数 。
脚本执行时间 , 单位:秒
本文插图
三、 SPL优化
【##从 TPCH 测试学习性能优化技巧之 Q19】本查询是个两表连接的过滤查询 , 结构上比较简单 , 但是过滤条件比较复杂 。 我们注意到 , 条件表达式中有不少项只与较小的表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表的行数次 。
脚本执行时间 , 单位:秒
本文插图
- 情感|心理测试:三把扇子你更心仪哪一个?测出你内心是软妹子还是女汉子
- 纯电|续航准确率接近90%! 深度测试东风标致e2008
- 舒适区|持续分享才能深度思考,不断学习走出舒适区,高效输出成就自己
- 情感|心理测试:三套别墅,你最想住进哪一个?测你未来恋人是什么身份!
- 嘴唇|心理测试:你最先把下图看成什么?测目前有多少人正在暗恋你!
- 杯子|「心理测试」拿杯子的姿势,看出你的性格特质
- 肖涵娜|心理测试:选一朵蝴蝶翅膀拼成的花,测你会如何认识你心中的恋人
- 爱情|心理测试:选一双有故事的手,测恋爱中缺少什么让你觉得不完美
- 肖涵娜|心理测试:第一眼你会选哪个有故事的女孩,测你的性格弱点是什么
- 雁城聊时尚|想学穿搭吗,来和我一起学习,能够让你摇身一变成为公主