用 TPCH 练习性能优化 Q6

一、 SQL及分析

查询SQL语句如下:

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;

这是一个简单的单表过滤后的聚合运算。

二、 SPL实现

利用并行查询即可。


A

1

=now()

2

1995-1-1

3

=elapse@y(A2,1)

4

=0.05-0.01

5

=0.05+0.01

6

>quantity=24

7

=file("lineitem.ctx").open().cursor@m(L_EXTENDEDPRICE*L_DISCOUNT:dp;L_SHIPDATE>=A2 && L_SHIPDATE<A3 && L_DISCOUNT>=A4 && L_DISCOUNT<=A5 && L_QUANTITY<quantity)

8

=A7.total(sum(dp))

9

=interval@ms(A1,now())

这里也使用了创建游标时即进行数据过滤以减少读取量的技巧。

三、 进一步优化

1. 优化方法

本例中要使用Q1中介绍的日期整数化优化方法,lineitem中的L_SHIPDATE已在Q1中转换过了。

2. 数据转换代码

2.1 lineitem转换

复制lineitem_5.ctx重命名为lineitem_6.ctx

3. 数据转换后的计算代码

计算代码:


A

1

=now()

2

1995-1-1

3

=days@o(elapse@y(A2,1))

4

=days@o(A2)

5

=0.05-0.01

6

=0.05+0.01

7

>quantity=24

8

=file("lineitem_6.ctx").open().cursor@m(L_EXTENDEDPRICE,L_DISCOUNT;L_SHIPDATE>=A4 && L_SHIPDATE<A3 && L_DISCOUNT>=A5 && L_DISCOUNT<=A6 && L_QUANTITY<quantity)

9

=A8.total(sum(L_EXTENDEDPRICE*L_DISCOUNT))

10

=interval@ms(A1,now())

四、 使用企业版列式计算

1. 原始数据


A

1

=now()

2

1995-1-1

3

=elapse@y(A2,1)

4

=0.05-0.01

5

=0.05+0.01

6

>quantity=24

7

=file("lineitem.ctx").open().cursor@mv(L_EXTENDEDPRICE,L_DISCOUNT; L_SHIPDATE>=A2 && L_SHIPDATE<A3 && L_QUANTITY<quantity && L_DISCOUNT>=A4 && L_DISCOUNT<=A5)

8

=A7.groups(;sum(L_EXTENDEDPRICE*L_DISCOUNT))

9

=interval@ms(A1,now())

2. 优化后数据


A

1

=now()

2

1995-1-1

3

=days@o(elapse@y(A2,1))

4

=days@o(A2)

5

=0.05-0.01

6

=0.05+0.01

7

>quantity=24

8

=file("lineitem_6.ctx").open().cursor@mv(L_EXTENDEDPRICE,L_DISCOUNT;L_SHIPDATE>=A4 && L_SHIPDATE<A3 && L_DISCOUNT>=A5 && L_DISCOUNT<=A6 && L_QUANTITY<quantity)

9

=A8.groups(;sum(L_EXTENDEDPRICE*L_DISCOUNT))

10

=interval@ms(A1,now())

五、 测试结果

单位:秒


常规

列式

优化前

6.6

5.2

优化后

5.5

3.3