性能优化案例课程 TPCH-Q6
select
sum(l_extendedprice * l_discount) as revenue
from
lineitem
where
l_shipdate >= date '1995-01-01'
and l_shipdate < date '1995-01-01' + interval '1' year
and l_discount between 0.05 - 0.01 and 0.05 + 0.01
and l_quantity < 24;
这是一个单表过滤后的聚合运算。
1. 数据存储
排序没有什么特殊要求,lineitem 按照主键 orderkey 有序存储即可,继续使用题目 Q3 中的 lineitem.ctx,复制到本题的主目录中。
2. 一般实现
计算代码:
A |
B |
|
1 |
=now() |
|
2 |
1995-1-1 |
=elapse@y(A2,1) |
3 |
=0.05-0.01 |
=0.05+0.01 |
4 |
>quantity=24 |
|
5 |
=file("lineitem.ctx").open().cursor@m(L_EXTENDEDPRICE,L_DISCOUNT;L_SHIPDATE>=A2 && L_SHIPDATE<B2 && L_DISCOUNT>=A3 && L_DISCOUNT<=B3 && L_QUANTITY<quantity) |
|
6 |
=A5.total(sum(L_EXTENDEDPRICE*L_DISCOUNT)) |
|
7 |
=interval@ms(A1,now()) |
注意 A5 的 cursor 函数不能直接写 L_EXTENDEDPRICE*L_DISCOUNT 这样的表达式,要写在 A6 中。
测试结果:
测试项目 |
执行时间(秒) |
一般实现 |
6 |
3. 数据变换
数据变换要采用前面题目提到的日期整数化手段。
Q1 中对 lineitem 表中的 L_SHIPDATE 已经整数化了,可以直接使用 lineitem6.ctx,复制到本题的主目录中。
计算代码:
A |
B |
|
1 |
=now() |
|
2 |
1995-1-1 |
|
3 |
=days@o(A2) |
=days@o(elapse@y(A2,1)) |
4 |
=0.05-0.01 |
=0.05+0.01 |
5 |
>quantity=24 |
|
6 |
=file("lineitem6.ctx").open().cursor@m(L_EXTENDEDPRICE,L_DISCOUNT;L_SHIPDATE>=A3 && L_SHIPDATE<B3 && L_DISCOUNT>=A4 && L_DISCOUNT<=B4 && L_QUANTITY<quantity) |
|
7 |
=A6.total(sum(L_EXTENDEDPRICE*L_DISCOUNT)) |
|
8 |
=interval@ms(A1,now()) |
测试结果:
测试项目 |
执行时间(秒) |
一般实现 |
6 |
数据变换 |
4 |
4. 列式计算
计算代码:
A |
B |
|
1 |
=now() |
|
2 |
1995-1-1 |
|
3 |
=days@o(A2) |
=days@o(elapse@y(A2,1)) |
4 |
=0.05-0.01 |
=0.05+0.01 |
5 |
>quantity=24 |
|
6 |
=file("lineitem6.ctx").open().cursor@m(L_EXTENDEDPRICE,L_DISCOUNT;L_SHIPDATE>=A3 && L_SHIPDATE<B3 && L_DISCOUNT>=A4 && L_DISCOUNT<=B4 && L_QUANTITY<quantity) |
|
7 |
=A6.total(sum(L_EXTENDEDPRICE*L_DISCOUNT)) |
|
8 |
=interval@ms(A1,now()) |
测试结果:
测试项目 |
执行时间(秒) |
一般实现 |
6 |
数据变换 |
4 |
列式计算 |
2 |
英文版