■从 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是并行数 。
脚本执行时间 , 单位:秒
【■从 TPCH 测试学习性能优化技巧之 Q19】
本文插图
三、 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表的行数次 。
脚本执行时间 , 单位:秒
本文插图
推荐阅读
- 「」惊喜!国乒女队再现黑马选手,队内测试发挥出色,勇夺第二名
- 「加提蓬,冯坤」中泰混血儿首度亮相!模样与冯坤高度相似,孩子正努力学习中文
- :乐福:学习德克,让我懂得了如何利用自己的优势以及投射
- 『体能训练』马奎尔:接受病毒测试后安心多了,希望能尽快找回状态
- 【学习】詹:在拜仁成长为了男人,学到了斗志和争冠的信念
- ■没有创新就没有超越——中国足球也适用
- 腕表交流学习FPJourne 2018年掀起运动风 推出钛金属亮黄表盘版本
- 造型造型要多变,学习欧美大咖,变身最靓的妞
- ■羽毛球接发球战术学习:如何接发高远球、平高球、网前球、平快球
- 宽哥诉体育心理测试:四个皮圈,你最想扔掉哪个?看你天生拥有什么好福气