性能优化案例课程 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