MySQL-tpch 测试工具简要手册
tpch是TPC(TransactionProcessingPerformanceCouncil)组织提供的工具包。用于进行OLAP测试,以评估商业分析中决策支持系统(DSS)的性能。它包含了一整套面向商业的ad-hoc查询和并发数据修改,强调测试的是数据库、平台和I/O性能,关注查询能力。
官网:http://www.tpc.org/tpch
下载地址:http://www.tpc.org/tpch/spec/tpch_2_14_3.tgz或http://www.tpc.org/tpch/spec/tpch_2_14_3.zip
1、编译安装
下载源码包,解压缩,然后:
cpmakefile.suitemakefile
修改makefile文件中的CC、DATABASE、MACHINE、WORKLOAD等定义:
################
##CHANGENAMEOFANSICOMPILERHERE
################
CC =gcc
#CurrentvaluesforDATABASEare:INFORMIX,DB2,ORACLE,
# SQLSERVER,SYBASE,TDAT(Teradata)
#CurrentvaluesforMACHINEare: ATT,DOS,HP,IBM,ICL,MVS,
# SGI,SUN,U2200,VMS,LINUX,WIN32
#CurrentvaluesforWORKLOADare: TPCH
DATABASE=MYSQL
MACHINE=LINUX
WORKLOAD=TPCH
修改tpcd.h文件,增加几行宏定义:
#ifdefMYSQL
#defineGEN_QUERY_PLAN""
#defineSTART_TRAN"STARTTRANSACTION"
#defineEND_TRAN"COMMIT"
#defineSET_OUTPUT""
#defineSET_ROWCOUNT"limit %d;\n"
#defineSET_DBASE"use %s;\n"
#endif
然后执行make编译,编译完毕后会生成两个可执行文件:
dbgen:数据生成工具。在使用InfiniDB官方测试脚本进行测试时,需要用该工具生成tpch相关表数据。
qgen:SQL生成工具
生成初始化测试数据:
[root@imysqltpch]#time./dbgen-s50
TPC-HPopulationGenerator(Version2.9.0)
CopyrightTransactionProcessingPerformanceCouncil1994-2008
real 192m43.897s
user 37m45.398s
sys 19m4.132s
[root@imysqltpch]#ls-lh*tbl
-rw-r--r--1rootroot1.2GSep2115:23customer.tbl
-rw-r--r--1rootroot1.4GSep2115:23lineitem.tbl
-rw-r--r--1rootroot2.2KSep2115:23nation.tbl
-rw-r--r--1rootroot317MSep2115:23orders.tbl
-rw-r--r--1rootroot504KSep2115:23partsupp.tbl
-rw-r--r--1rootroot464KSep2115:23part.tbl
-rw-r--r--1rootroot 389Sep2115:23region.tbl
-rw-r--r--1rootroot 69MSep2115:23supplier.tbl
dbgen参数-s的作用是指定生成测试数据的仓库数,建议基准值设定在100以上,在我的测试环境中,一般都设定为1000。
由于源码包中自带的tpch初始化库表脚本并不能完全适用MySQL,需要修改部分代码。
先生成测试SQL脚本:
[root@imysqltpch]#./qgen|sed-e's/\r//'>queries/tpch_queries.sql
而后用vim打开tpch_queries.sql脚本,进行下面几次全局替换:
:%s/;\nlimit/limit/g
:%s/limit-1/limit1/g
搜索所有类似下面的语句,去掉后面的(3):
l_shipdate<=date'1998-12-01'-interval'106'day(3)
=>
l_shipdate<=date'1998-12-01'-interval'106'day
再修改第369行附近:
count(o_orderkey)
=>
count(o_orderkey)asc_count
修改第376行左右
)asc_orders(c_custkey,c_count)
=>
)asc_orders
修改第431行附近:
dropviewrevenue0limit1;
=>
dropviewrevenue0;
最后把大的查询SQL脚本拆分成23个独立的SQL查询脚本,分别从tpch_01.sql~tpch_23.sql。
2、初始化库表
tpch提供的数据库表初始化脚本有些小问题,需要进行修改:
dss.ddl–DSS库初始化DDL脚本
dss.ri –DSS数据表创建索引、外键脚本
dss.ddl脚本需要增加几行:
dropdatabasetpch;
createdatabasetpch;
usetpch;
dss.ri脚本需要修改几个地方:
修改第4行左右:
CONNECTTOTPCD;
=>
Usetpch;
修改第6~13行,所有的SQL注释符“--”后面再加一个空格:
--ALTERTABLETPCD.REGIONDROPPRIMARYKEY;
--ALTERTABLETPCD.NATIONDROPPRIMARYKEY;
--ALTERTABLETPCD.PARTDROPPRIMARYKEY;
--ALTERTABLETPCD.SUPPLIERDROPPRIMARYKEY;
--ALTERTABLETPCD.PARTSUPPDROPPRIMARYKEY;
--ALTERTABLETPCD.ORDERSDROPPRIMARYKEY;
--ALTERTABLETPCD.LINEITEMDROPPRIMARYKEY;
--ALTERTABLETPCD.CUSTOMERDROPPRIMARYKEY;
修改第25行:
ADDFOREIGNKEYNATION_FK1(N_REGIONKEY)referencesTPCD.REGION;
=>
ADDFOREIGNKEYNATION_FK1(N_REGIONKEY)referencesTPCD.REGION(R_REGIONKEY);
修改第40行:
ADDFOREIGNKEYSUPPLIER_FK1(S_NATIONKEY)referencesTPCD.NATION;
=>
ADDFOREIGNKEYSUPPLIER_FK1(S_NATIONKEY)referencesTPCD.NATION(N_NATIONKEY);
修改第55行:
ADDFOREIGNKEYCUSTOMER_FK1(C_NATIONKEY)referencesTPCD.NATION;
=>
ADDFOREIGNKEYCUSTOMER_FK1(C_NATIONKEY)referencesTPCD.NATION(N_NATIONKEY);
修改第73行:
ADDFOREIGNKEYPARTSUPP_FK1(PS_SUPPKEY)referencesTPCD.SUPPLIER;
=>
ADDFOREIGNKEYPARTSUPP_FK1(PS_SUPPKEY)referencesTPCD.SUPPLIER(S_SUPPKEY);
修改第78行:
ADDFOREIGNKEYPARTSUPP_FK2(PS_PARTKEY)referencesTPCD.PART;
=>
ADDFOREIGNKEYPARTSUPP_FK2(PS_PARTKEY)referencesTPCD.PART(P_PARTKEY);
修改第84行:
ADDFOREIGNKEYORDERS_FK1(O_CUSTKEY)referencesTPCD.CUSTOMER;
=>
ADDFOREIGNKEYORDERS_FK1(O_CUSTKEY)referencesTPCD.CUSTOMER(C_CUSTKEY);
修改第90行:
ADDFOREIGNKEYLINEITEM_FK1(L_ORDERKEY) referencesTPCD.ORDERS;
=>
ADDFOREIGNKEYLINEITEM_FK1(L_ORDERKEY) referencesTPCD.ORDERS(O_ORDERKEY);
修改第96行:
TPCD.PARTSUPP;
=>
TPCD.PARTSUPP(PS_PARTKEY,PS_SUPPKEY);
另外,由于tpch生成的表名是大写的,需要修改下表名成小写的,因此再增加几行:
usetpch;
altertableCUSTOMER renametocustomer;
altertableLINEITEM renametolineitem;
altertableNATION renametonation ;
altertableORDERS renametoorders ;
altertablePART renametopart ;
altertablePARTSUPP renametopartsupp;
altertableREGION renametoregion ;
altertableSUPPLIER renametosupplier;
3、导入数据
测试数据生成了,测试库表也初始化完了,接下来就可以开始导入数据了。
需要注意下,如果开启了binlog,在导入前最好先关闭binlog,否则会提示超出max_binlog_cache_size的错误提示,如果不能关闭binlog,则需要把导入文件切分成多个小文件再导入。
myqsl-e"LOADDATAINFILE'path/dbgen/customer.tbl'INTOTABLECUSTOMERFIELDSTERMINATEDBY'|';"
myqsl-e"LOADDATAINFILE'path/dbgen/orders.tbl' INTOTABLEORDERS FIELDSTERMINATEDBY'|';"
myqsl-e"LOADDATAINFILE'path/dbgen/lineitem.tbl'INTOTABLELINEITEMFIELDSTERMINATEDBY'|';"
myqsl-e"LOADDATAINFILE'path/dbgen/nation.tbl' INTOTABLENATION FIELDSTERMINATEDBY'|';"
myqsl-e"LOADDATAINFILE'path/dbgen/partsupp.tbl'INTOTABLEPARTSUPPFIELDSTERMINATEDBY'|';"
myqsl-e"LOADDATAINFILE'path/dbgen/part.tbl' INTOTABLEPART FIELDSTERMINATEDBY'|';"
myqsl-e"LOADDATAINFILE'path/dbgen/region.tbl' INTOTABLEREGION FIELDSTERMINATEDBY'|';"
myqsl-e"LOADDATAINFILE'path/dbgen/supplier.tbl'INTOTABLESUPPLIERFIELDSTERMINATEDBY'|';"
4、执行tpch测试
接下来就可以进行tpch测试了,逐个执行23个查询SQL脚本即可,每次执行前都要重启下MySQL实例,确保每次的内存缓冲区都是干净的。
简单循环测试脚本如下:
#!/bin/sh ## ##执行tpchOLAP测试 ## ##writedbyyejr(http://imysql.com),2012/12/14 ## PATH=$PATH:/usr/local/bin exportPATH .~/.bash_profile>/dev/null2>&1 exec3>&14>&21>>tpch-benchmark-olap-`date+'%Y%m%d%H%M%S'`.log2>&1 I=1 II=3 while[$I-le$II] do N=1 T=23 while[$N-lt$T] do if[$N-lt10];then NN='0'$N else NN=$N fi echo"query$NNstarting" /etc/init.d/mysqlrestart timemysql-ftpch<./queries/tpch_${NN}.sql echo"query$NNended!" N=`expr$N+1` done I=`expr$I+1` Done
附件:tpch初始化、自动化测试脚本压缩包与word手册。