5.数据查询
需要说明的是,虽然TPC-H测试中每个表都有唯一键,表之间有引用关系,TPC-H规范并不要求测试表定义中必须包含主键和外键定义。而允许测试的数据库自行决定。我们在测试过程中发现,如果不创建这些主键和外键,即使做了统计分析,某些查询的时间非常长,估计是优化器没有办法得出良好的执行计划。因此,以下测试均在创建主键和外键后进行。原始tpch脚本dss.ri中创建外键的语法不符合DB2的格式要求,需要做相应的修改。
ALTER TABLE REGION ADD PRIMARY KEY (R_REGIONKEY)
DB20000I The SQL command completed successfully.
ALTER TABLE NATION ADD PRIMARY KEY (N_NATIONKEY)
DB20000I The SQL command completed successfully.
ALTER TABLE NATION ADD CONSTRAINT NATION_FK1 FOREIGN KEY (N_REGIONKEY) references REGION
DB20000I The SQL command completed successfully.
…
为了比较不同条件下的查询结果,我们进行了4种组合的查询。分别是:单进程不压缩,并行不压缩,单进程压缩,并行压缩,每种测试做2遍,取较快的一遍的结果。
测试工具选用db2batch。
虽然理论上也可以用clpplus执行tpch的查询脚本,但目前版本的clpplus在处理%、$等特殊字符方面还有缺陷,因此不完全适用,还是采用db2特有的db2batch工具。在修改完成的包含22个查询语句的sql脚本前端和每个查询前面加上如下参数,就可以方便地进行多次测试。
--#COMMENT Q1
执行测试的命令行如下:
以下是调整过的某次执行的报告。删除了一些多余信息。
Type Number Reps Total Time (s) Min Time (s) Arithmetic Mean Row Fetch Row Output
--------- ------ ---- -------------- -------------- --------------- --------- ----------
Statement 1 1 288.889663 288.889663 288.889663 4 4
Statement 2 1 30.026864 30.026864 30.026864 100 100
Statement 3 1 132.680303 132.680303 132.680303 10 10
Statement 4 1 152.142768 152.142768 152.142768 5 5
Statement 5 1 167.999306 167.999306 167.999306 5 5
Statement 6 1 38.923512 38.923512 38.923512 1 1
Statement 7 1 68.086120 68.086120 68.086120 4 4
Statement 8 1 0.000000 0.000000 0.000000 0 0
Statement 9 1 0.000000 0.000000 0.000000 0 0
Statement 10 1 36.261017 36.261017 36.261017 20 20
Statement 11 1 5.672096 5.672096 5.672096 0 0
* Total Entries: 11
* Total Time: 920.681649 seconds
* Minimum Time: 0.000000 seconds
* Maximum Time: 288.889663 seconds
* Arithmetic Mean Time: 83.698332 seconds
* Geometric Mean Time: 0.686790 seconds
---------------------------------------------
* Timestamp: 六 5月 07 2011 10:02:06 CST
除了第8,9查询语句有错没有执行以外,其余9个查询的时间和输出行数都列举了。
如果是需要强制并行查询,则采用下面的设置。查询优化器自动采用并行查询。
Enable intra-partition parallelism (INTRA_PARALLEL) = NO
[db2inst1@aix:/home/db2inst1]#>db2 update dbm cfg using INTRA_PARALLEL YES
DB20000I The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.
[db2inst1@aix:/home/db2inst1]#>db2 get dbm cfg|grep PARA
Enable intra-partition parallelism (INTRA_PARALLEL) = YES
[db2inst1@aix:/home/db2inst1]#>db2 get dbm cfg|grep DEGR
Maximum query degree of parallelism (MAX_QUERYDEGREE) = ANY
--重启数据库,使新配置生效
[db2inst1@aix:/home/db2inst1]#>db2stop force
05/12/2011 17:14:57 0 0 SQL1064N DB2STOP processing was successful.
SQL1064N DB2STOP processing was successful.
[db2inst1@aix:/home/db2inst1]#>db2start
05/12/2011 17:15:04 0 0 SQL1063N DB2START processing was successful.
SQL1063N DB2START processing was successful.
--查看执行计划,已经启用了并行
[db2inst1@aix:/home/db2inst1]#>db2expln -d tpch -q "select count(*) from tpch.nation,tpch.region" -t
DB2 Universal Database Version 9.7, 5622-044 (c) Copyright IBM Corp. 1991, 2009
Licensed Material - Program Property of IBM
IBM DB2 Universal Database SQL and XQUERY Explain Tool
******************** DYNAMIC ***************************************
==================== STATEMENT ==========================================
Isolation Level = Cursor Stability
Blocking = Block Unambiguous Cursors
Query Optimization Class = 5
Partition Parallel = No
Intra-Partition Parallel = Yes (Bind Degree = ANY )
SQL Path = "SYSIBM", "SYSFUN", "SYSPROC", "SYSIBMADM",
"DB2INST1"
Statement:
select count(*)
from tpch.nation, tpch.region
Intra-Partition Parallelism Degree = 48
Section Code Page = 1208
要查看各查询的时间,在linux下可以用grep命令。在Windows下用find命令。
* Elapsed Time is: 462.886726 seconds
* Elapsed Time is: 13.512276 seconds
* Elapsed Time is: 55.491186 seconds
* Elapsed Time is: 51.078679 seconds
C:\downloads>find "Elapsed Time is" q01-22_f_nozip.log
---------- Q01-22_F_NOZIP.LOG
* Elapsed Time is: 449.982390 seconds
* Elapsed Time is: 10.560007 seconds
* Elapsed Time is: 62.286401 seconds
下面是各组查询测试结果。(第20个查询在并行查询中无法在可接受的时间内返回结果,测试数据略)
▲表1 TPC-H scale=10未压缩和压缩数据的测试对比,单位:秒
令人惊异的,无论是否压缩,并行查询的速度基本上比单进程都有所降低,有的甚至十余个小时不能查询出结果(第20个查询)。这个结果跟我们的预期相去甚远。用来测试的机器有8个逻辑CPU,基本上发挥不了作用。
从上述数据我们还可以得出单进程和并行分别查询压缩和非压缩数据的差异。
▲表2 TPC-H scale=10压缩前后数据的测试对比,单位:倍
如上表所示,从合计时间看,单进程压缩比不压缩最大提高了2倍,总体大约提高了27%。而并行条件下,最大则有2.6倍的性能提高。从单个查询看,无论是否并行,压缩和不压缩互有胜负,这跟前面我们列出的压缩文件大小有关,如果I/O没有变化或者更大,那么加上解压开销,查询速度下降也是必然的。