# 一、TPC系列 - 交易处理效能委员会([TPC](http://www.tpc.org/), Transaction Processing Performance Council)组织制定。 - TPC-C主要测试数据库系统的事务处理能力。 - TPC-App用于测试7*24环境下B2B的应用服务和Web服务能力。 - TPC-E大型企业信息服务测试基准。 - TPC-H主要评价特点查询的决策支持能力,强调在数据挖掘和分析处理方面的能力。 # 二、最新2.18.0 TPC-H标准 8个关系表:customer.tbl、lineitem.tbl、nation.tbl、orders.tbl、partsupp.tbl、part.tbl、region.tbl、supplier.tbl,其中,nation.tbl和region.tbl表数据量不变,其它表数据量与比例因子(SF)有关。 数据库关系图: ![img](../../../../ff_internal_upload/img/2015/image140.jpg) - 数据量支持1G~100T。 - 可以SF值:1、10、30、100、300、1000、3000、10000、30000、100000。 - 22个SQL复杂程度超过大多数实际OLTP应用,在22个查询执行同时,还有一对更新操作RF1和RF2,RF1向orders.tbl和lineitem.tbl表插入原数据行数的0.1%的新行,RF2从orders.tbl和lineitem.tbl表中删除与R1增加的等量数据行,即,更新后数据量不变。RF1本质是Insert命令,而RF2是Delete命令。 - Power测试:随机执行22条查询流中的一条测试流和2条测试流中的一条,考核指标:QppH@Size; - Throughout测试执行多条查询流和一条更新流的混合操作,考核指标:QthH@Size。 - Power测试和Throughout测试通过数理方式合成的结果是TPC-H基准测试中的关键指标:QphH@Size,每小时数据查询数,是QppH@Size和QthH@Size结果的乘积的1/2次方。 - SQL语法遵循SQL-92标准。 - TPC-H三个子测试:数据装载测试、Power测试和Throughout测试。 # 三、TPC-H工具使用(MySQL为例) ## 下载TPC-H工具 [从TPC官网下载](http://www.tpc.org/tpc_documents_current_versions/current_specifications5.asp)。 ## 编译 ```bash [yz@MiWiFi-R4A-srv ~]$ cd 2.18.0_rc2/ [yz@MiWiFi-R4A-srv 2.18.0_rc2]$ cd dbgen/ ``` ```bash [yz@MiWiFi-R4A-srv dbgen]$ cp makefile.suite Makefile [yz@MiWiFi-R4A-srv dbgen]$ vim Makefile CC=gcc DATABASE=MYSQL MACHINE =LINUX WORKLOAD =TPCH ``` 定义MySQL方言: ```bash [yz@MiWiFi-R4A-srv dbgen]$ vim tpcd.h # 添加以下定义: #ifdef MYSQL #define GEN_QUERY_PLAN "" #define START_TRAN "" #define END_TRAN "" #define SET_OUTPUT "" #define SET_ROWCOUNT "limit %d;\n" #define SET_DBASE "" #endif ``` 编译: ```bash [yz@MiWiFi-R4A-srv dbgen]$ make ``` ## 生成数据 dbgen -h命令可查看命令帮助。 -s 10表示产生10个Scale Factor数据,1SF=1GB数据。以生成1s数据为例: ```bash [yz@MiWiFi-R4A-srv dbgen]$ ./dbgen -s 1 -f TPC-H Population Generator (Version 2.18.0) Copyright Transaction Processing Performance Council 1994 - 2010 ``` 生成数据如下: ```bash [yz@MiWiFi-R4A-srv dbgen]$ ll *.tbl -rw-rw-r--. 1 yz yz 24346144 5月 19 20:56 customer.tbl -rw-rw-r--. 1 yz yz 759863287 5月 19 20:56 lineitem.tbl -rw-rw-r--. 1 yz yz 2224 5月 19 20:56 nation.tbl -rw-rw-r--. 1 yz yz 171952161 5月 19 20:56 orders.tbl -rw-rw-r--. 1 yz yz 118984616 5月 19 20:56 partsupp.tbl -rw-rw-r--. 1 yz yz 24135125 5月 19 20:56 part.tbl -rw-rw-r--. 1 yz yz 389 5月 19 20:56 region.tbl -rw-rw-r--. 1 yz yz 1409184 5月 19 20:56 supplier.tbl ``` ## 生成的tbl文件行尾不加分隔符 默认情况下,dbgen生成的数据表以“|”分割列,行尾也有“|”分隔符,但是有些数据库的加载程序不支持以分隔符结尾,所以需要在生成数据后去除行尾的分隔符。 如果希望生成的数据行尾不带分隔符,需要对TPC-H tool代码做个小修订,编辑dbgen/config.h配置文件: ```c #define EOL_HANDLING ``` 重新编译。 ## 生成查询SQL ```bash [yz@MiWiFi-R4A-srv dbgen]$ DSS_QUERY=queries ./qgen -s 1 | sed -e 's/\r//' > tpch_query.sql ``` 修改查询错误: ```sql (1) "day (3)" => "day" (2) "limit -1" => "limit 1" (3) 去除"limit"前一行多余的分号(vim:%s/;\nlimit/^Mlimit) vim输入^M: Ctrl-v, Ctrl-m (4) query 13: "count(o_orderkey)" => "count(o_orderkey) as c_count" ") as c_orders (c_custkey, c_count)" => ") as c_orders" (5) query 15: s_suppkey; drop view revenue0 limit 1; => s_suppkey limit 1; drop view revenue0; (6) interval: interval 'i' day => interval i day interval 'j' month => interval j month interval 'k' year => interval k year (7) 删除头部注释行,用例内部不留空行,用例之间以2空行分隔 ``` create view revenue0查询与其后面的select作为一个用例,且中间不留空行。 将tpch_querys.sql拆分为22个文件:q1.sql, q2.sql, ..., q22.sql ```bash [yz@MiWiFi-R4A-srv dbgen]$ awk -v RS="\n\n" 'BEGIN {n=1}{print $0 > "q"n++".sql"}' tpch_query.sql [yz@MiWiFi-R4A-srv dbgen]$ ls *.sql q10.sql q13.sql q16.sql q19.sql q21.sql q24.sql q3.sql q6.sql q9.sql q11.sql q14.sql q17.sql q1.sql q22.sql q25.sql q4.sql q7.sql q12.sql q15.sql q18.sql q20.sql q23.sql q2.sql q5.sql q8.sql ```