四、性能测试
测试项目包含三方面,第一是加载,数据仓库要处理的数据量巨大,数据加载能力是选择数据库软件要考虑的重要因素之一,我们将测试包括外部文本数据加载和从数据库内部抽取部分数据到其他表的性能。第二是压缩,数据压缩时常被作为列式数据库的一个卖点来宣传,因此我们单独把它拿出来测试。由于多数数据库没有单独的表压缩命令,都是依靠参数指定是否压缩或根本无法指定不压缩(Sybase IQ),只测试压缩后的占用空间对原始外部文件的压缩率。第三是测试重点,数据查询,主要采用tpc-h scala=10,TPC-H是一个业界公认的数据仓库性能测试基准,比较公正和中立,它定义了8个标准数据库表:customer,lineitem,nation,orders,partsupp,part,region,supplier,各表之间的关系见tpc.org网站的官方文档,一个数据生成工具(dbgen)和一个查询生成工具(qgen)。此外TPC-H定义了不同的数据仓库容量(size),包括:1GB、100GB、300GB、1000GB等。dbgen工具可以通过传递不同的参数值,生成不同数据库尺寸下的表数据,非常灵活。 Qgen可以随机产生相同条件的不同取值的查询,我们这里为了简化,只取一次产生的查询语句。其标准语句也可以从www.tpc.org的测试结果中获得,为了公正起见,采用TPC组织在2010年12月15日在IBM Power 780平台中的测试语句,下载地址:http://www.tpc.org/results/FDR/tpch/TPC-H_1TB_IBM780_Sybase-SupportingFilesArchive.zip。
(一) 数据加载
1. 从外部文本文件导入
首先对TPC-H的原始文件进行编译,然后执行如下语句,生成测试数据集:
../tpch/dbgen -s 10 -C 4 -S 1 -T L -f -b dists.dss
../tpch/dbgen -s 10 -C 4 -S 2 -T L -f -b dists.dss
../tpch/dbgen -s 10 -C 4 -S 3 -T L -f -b dists.dss
../tpch/dbgen -s 10 -C 4 -S 4 -T L -f -b dists.dss
# for ORDERS
../tpch/dbgen -s 10 -T O -f -b dists.dss
# for PART
../tpch/dbgen -s 10 -T P -f -b dists.dss
# for PARTSUPP
../tpch/dbgen -s 10 -T S -f -b dists.dss
# for SUPPLIER
../tpch/dbgen -s 10 -T s -f -b dists.dss
# for CUSTOMER
../tpch/dbgen -s 10 -T c -f -b dists.dss
# for NATION
../tpch/dbgen -T n -f -b dists.dss
# for REGION
../tpch/dbgen -T r -f -b dists.dss
我们装载数据测试结果如下:
load supplier execute time is : 980ms, load data : 100000 row(s) affected
load partsupp execute time is : 25305ms, load data : 8000000 row(s) affected
load customer execute time is : 6769ms, load data : 1500000 row(s) affected
load orders execute time is : 56055ms, load data : 15000000 row(s) affected
load lineitem execute time is : 175609ms, load data : 59986052 row(s) affected
load NATION execute time is : 0ms, load data : 5 row(s) affected
load REGION execute time is : 0ms, load data : 25 row(s) affected
[Execution time: 271.953 seconds]
从结果来看,对于记录数最大、表最宽的lineitem,装载速度大约34万多行/秒!由此可以看到IQ的简单、较高的压缩能力、较高的性能等特点!另外,带索引快速加载也是IQ的特色,相对于行式数据库,可以更快速的完成加载。
2. 从数据库内部抽取部分数据到其他表
数据库从库内转移数据的方法有多种,SybaseIQ支持insert into 表1 select * from 表2这种方式。
SybaseIQ的命令行:
partition by range(id)
(
p11 values <=('12'),
p12 values <=('13'),
p13 values <=('14'),
p14 values <=('15'),
p15 values <=('16')
);
(DBA)> read /user1/app/sybase_part.txt
执行时间: 0.449 秒
(DBA)> insert into rk.hu1 select * from rk.hu where id<'2';
已插入 41533005 行
执行时间: 377.465 秒
(DBA)> commit;
执行时间: 0.011 秒