《Mysql應(yīng)用MySQL-tpch 測(cè)試工具簡(jiǎn)要手冊(cè)》要點(diǎn):
本文介紹了Mysql應(yīng)用MySQL-tpch 測(cè)試工具簡(jiǎn)要手冊(cè),希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
tpch是TPC(Transaction Processing Performance Council)組織提供的工具包.用于進(jìn)行OLAP測(cè)試,以評(píng)估商業(yè)分析中決策支持系統(tǒng)(DSS)的性能.它包含了一整套面向商業(yè)的ad-hoc查詢和并發(fā)數(shù)據(jù)修改,強(qiáng)調(diào)測(cè)試的是數(shù)據(jù)庫(kù)、平臺(tái)和I/O性能,關(guān)注查詢能力.
官網(wǎng):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.zipMYSQL教程
1、編譯安裝MYSQL教程
下載源碼包,解壓縮,然后:
cp makefile.suite makefileMYSQL教程
修改makefile文件中的CC、DATABASE、MACHINE、WORKLOAD等定義:
################
## CHANGE NAME OF ANSI COMPILER HERE
################
CC????? = gcc
# Current values for DATABASE are: INFORMIX, DB2, ORACLE,
#????????????????????????????????? SQLSERVER, SYBASE, TDAT (Teradata)
# Current values for MACHINE are:? ATT, DOS, HP, IBM, ICL, MVS,
#????????????????????????????????? SGI, SUN, U2200, VMS, LINUX, WIN32
# Current values for WORKLOAD are:? TPCH
DATABASE= MYSQL
MACHINE = LINUX
WORKLOAD = TPCHMYSQL教程
修改tpcd.h文件,增加幾行宏定義:
#ifdef MYSQL
#define GEN_QUERY_PLAN ""
#define START_TRAN "START TRANSACTION"
#define END_TRAN "COMMIT"
#define SET_OUTPUT ""
#define SET_ROWCOUNT "limit?%d;\n"
#define SET_DBASE "use?%s;\n"
#endif
然后執(zhí)行make編譯,編譯完畢后會(huì)生成兩個(gè)可執(zhí)行文件:
?dbgen:數(shù)據(jù)生成工具.在使用InfiniDB官方測(cè)試腳本進(jìn)行測(cè)試時(shí),需要用該工具生成tpch相關(guān)表數(shù)據(jù).
?qgen:SQL生成工具
生成初始化測(cè)試數(shù)據(jù):
[root@imysql tpch]# time ./dbgen -s 50
TPC-H Population Generator (Version 2.9.0)
Copyright Transaction Processing Performance Council 1994 - 2008MYSQL教程
real??? 192m43.897s
user??? 37m45.398s
sys???? 19m4.132sMYSQL教程
[root@imysql tpch]# ls -lh *tbl
-rw-r--r-- 1 root root 1.2G Sep 21 15:23 customer.tbl
-rw-r--r-- 1 root root 1.4G Sep 21 15:23 lineitem.tbl
-rw-r--r-- 1 root root 2.2K Sep 21 15:23 nation.tbl
-rw-r--r-- 1 root root 317M Sep 21 15:23 orders.tbl
-rw-r--r-- 1 root root 504K Sep 21 15:23 partsupp.tbl
-rw-r--r-- 1 root root 464K Sep 21 15:23 part.tbl
-rw-r--r-- 1 root root? 389 Sep 21 15:23 region.tbl
-rw-r--r-- 1 root root? 69M Sep 21 15:23 supplier.tbl
dbgen參數(shù) -s 的作用是指定生成測(cè)試數(shù)據(jù)的倉(cāng)庫(kù)數(shù),建議基準(zhǔn)值設(shè)定在100以上,在我的測(cè)試環(huán)境中,一般都設(shè)定為1000.
由于源碼包中自帶的tpch初始化庫(kù)表腳本并不能完全適用MySQL,需要修改部分代碼.
先生成測(cè)試SQL腳本:
[root@imysql tpch]# ./qgen | sed -e 's/\r//' > queries/tpch_queries.sqlMYSQL教程
而后用vim打開tpch_queries.sql腳本,進(jìn)行下面幾次全局替換:
:%s/;\nlimit/ limit/g
:%s/limit -1/limit 1/gMYSQL教程
搜索所有類似下面的語句,去掉后面的 (3):
l_shipdate <= date '1998-12-01' - interval '106' day (3)
=>
l_shipdate <= date '1998-12-01' - interval '106' dayMYSQL教程
再修改第369行附近:
count(o_orderkey)
=>
count(o_orderkey) as c_countMYSQL教程
修改第376行左右
) as c_orders (c_custkey, c_count)
=>
) as c_ordersMYSQL教程
修改第431行附近:
drop view revenue0 limit 1;
=>
drop view revenue0;MYSQL教程
最后把大的查詢SQL腳本拆分成23個(gè)獨(dú)立的SQL查詢腳本,分別從tpch_01.sql ~ tpch_23.sql.MYSQL教程
2、初始化庫(kù)表MYSQL教程
tpch提供的數(shù)據(jù)庫(kù)表初始化腳本有些小問題,需要進(jìn)行修改:
dss.ddl C DSS庫(kù)初始化DDL腳本
dss.ri? C DSS數(shù)據(jù)表創(chuàng)建索引、外鍵腳本
dss.ddl腳本需要增加幾行:
drop database tpch;
create database tpch;
use tpch;MYSQL教程
dss.ri腳本需要修改幾個(gè)地方:
修改第4行左右:
CONNECT TO TPCD;
=>
Use tpch;MYSQL教程
修改第6~13行,所有的SQL注釋符 “--” 后面再加一個(gè)空格:
-- ALTER TABLE TPCD.REGION DROP PRIMARY KEY;???????????????????????????????????????????????????????????????????????????????????????
-- ALTER TABLE TPCD.NATION DROP PRIMARY KEY;???????????????????????????????????????????????????????????????????????????????????????
-- ALTER TABLE TPCD.PART DROP PRIMARY KEY;?????????????????????????????????????????????????????????????????????????????????????????
-- ALTER TABLE TPCD.SUPPLIER DROP PRIMARY KEY;?????????????????????????????????????????????????????????????????????????????????????
-- ALTER TABLE TPCD.PARTSUPP DROP PRIMARY KEY;?????????????????????????????????????????????????????????????????????????????????????
-- ALTER TABLE TPCD.ORDERS DROP PRIMARY KEY;???????????????????????????????????????????????????????????????????????????????????????
-- ALTER TABLE TPCD.LINEITEM DROP PRIMARY KEY;?????????????????????????????????????????????????????????????????????????????????????
-- ALTER TABLE TPCD.CUSTOMER DROP PRIMARY KEY;MYSQL教程
修改第25行:
ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references TPCD.REGION;
=>
ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references TPCD.REGION(R_REGIONKEY);MYSQL教程
修改第40行:
ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references TPCD.NATION;
=>
ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references TPCD.NATION(N_NATIONKEY);MYSQL教程
修改第55行:
ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references TPCD.NATION;
=>
ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references TPCD.NATION(N_NATIONKEY);MYSQL教程
修改第73行:
ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references TPCD.SUPPLIER;
=>
ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references TPCD.SUPPLIER(S_SUPPKEY);MYSQL教程
修改第78行:
ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references TPCD.PART;
=>
ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references TPCD.PART(P_PARTKEY);MYSQL教程
修改第84行:
ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references TPCD.CUSTOMER;
=>
ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references TPCD.CUSTOMER(C_CUSTKEY);MYSQL教程
修改第90行:
ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY)? references TPCD.ORDERS;
=>
ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY)? references TPCD.ORDERS(O_ORDERKEY);MYSQL教程
修改第96行:
TPCD.PARTSUPP;
=>
TPCD.PARTSUPP(PS_PARTKEY,PS_SUPPKEY);MYSQL教程
另外,由于tpch生成的表名是大寫的,需要修改下表名成小寫的,因此再增加幾行:
use tpch;MYSQL教程
alter table CUSTOMER?rename to customer ;
alter table LINEITEM?rename to lineitem ;
alter table NATION?rename to nation?? ;
alter table ORDERS?rename to orders?? ;
alter table PART?rename to part???? ;
alter table PARTSUPP?rename to partsupp ;
alter table REGION?rename to region?? ;
alter table SUPPLIER?rename to supplier ;MYSQL教程
3、導(dǎo)入數(shù)據(jù)
測(cè)試數(shù)據(jù)生成了,測(cè)試庫(kù)表也初始化完了,接下來就可以開始導(dǎo)入數(shù)據(jù)了.
需要注意下,如果開啟了binlog,在導(dǎo)入前最好先關(guān)閉binlog,否則會(huì)提示超出max_binlog_cache_size的錯(cuò)誤提示,如果不能關(guān)閉binlog,則需要把導(dǎo)入文件切分成多個(gè)小文件再導(dǎo)入.
myqsl -e "LOAD DATA INFILE 'path/dbgen/customer.tbl' INTO TABLE CUSTOMER FIELDS TERMINATED BY '|';"
myqsl -e "LOAD DATA INFILE 'path/dbgen/orders.tbl'?? INTO TABLE ORDERS?? FIELDS TERMINATED BY '|';"
myqsl -e "LOAD DATA INFILE 'path/dbgen/lineitem.tbl' INTO TABLE LINEITEM FIELDS TERMINATED BY '|';"
myqsl -e "LOAD DATA INFILE 'path/dbgen/nation.tbl'?? INTO TABLE NATION?? FIELDS TERMINATED BY '|';"
myqsl -e "LOAD DATA INFILE 'path/dbgen/partsupp.tbl' INTO TABLE PARTSUPP FIELDS TERMINATED BY '|';"
myqsl -e "LOAD DATA INFILE 'path/dbgen/part.tbl'???? INTO TABLE PART???? FIELDS TERMINATED BY '|';"
myqsl -e "LOAD DATA INFILE 'path/dbgen/region.tbl'?? INTO TABLE REGION?? FIELDS TERMINATED BY '|';"
myqsl -e "LOAD DATA INFILE 'path/dbgen/supplier.tbl' INTO TABLE SUPPLIER FIELDS TERMINATED BY '|';"MYSQL教程
4、執(zhí)行tpch測(cè)試
接下來就可以進(jìn)行tpch測(cè)試了,逐個(gè)執(zhí)行23個(gè)查詢SQL腳本即可,每次執(zhí)行前都要重啟下MySQL實(shí)例,確保每次的內(nèi)存緩沖區(qū)都是干凈的.
簡(jiǎn)單循環(huán)測(cè)試腳本如下:MYSQL教程
#!/bin/sh ## ## 執(zhí)行tpch OLAP測(cè)試 ## ## writed by yejr(http://imysql.com), 2012/12/14 ## PATH=$PATH:/usr/local/bin export PATH . ~/.bash_profile > /dev/null 2>&1 exec 3>&1 4>&2 1>> tpch-benchmark-olap-`date +'%Y%m%d%H%M%S'`.log 2>&1 I=1 II=3 while [ $I -le $II ] do N=1 T=23 while [ $N -lt $T ] do if [ $N -lt 10 ] ; then NN='0'$N else NN=$N fi echo "query $NN starting" /etc/init.d/mysql restart time mysql -f tpch < ./queries/tpch_${NN}.sql echo "query $NN ended!" N=`expr $N + 1` done I=`expr $I + 1` Done
附件:tpch初始化、自動(dòng)化測(cè)試腳本壓縮包與word手冊(cè).MYSQL教程
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/5953.html