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