0%

TPC-H

阅读更多

本文转载摘录自TPC-H 使用

1 前言

1.1 TPC简介

事务处理性能委员会(Transaction Processing Performance Council),是由数10家会员公司创建的非盈利组织,总部设在美国。该组织对全世界开放,但迄今为止,绝大多数会员都是美、日、西欧的大公司。TPC的成员主要是计算机软硬件厂家,而非计算机用户,它的功能是制定商务应用基准程序(Benchmark)的标准规范、性能和价格度量,并管理测试结果的发布

TPC-C用于测试数据库系统的事务处理能力,TPC-App用于测试7×24环境下B2B的应用服务和Web服务的能力。TPC组织还发布过TPC-S(Server专门测试基准程序)、TPC-E(大型企业信息服务测试基准程序)和TPC-Client/Server等测试标准,但这3个标准不被业界接受而被放弃

TPC不给出基准程序的代码,而只给出基准程序的标准规范(Standard Specification)。任何厂家或其它测试者都可以根据规范,最优地构造出自己的系统(测试平台和测试程序)。(需要自己写测试工具,测试完之后提交给TPC协会)为保证测试结果的客观性,被测试者(通常是厂家)必须提交给TPC一套完整的报告(FullDisclosure Report),包括被测系统的详细配置、分类价格和包含五年维护费用在内的总价格。该报告必须由TPC授权的审核员核实(TPC本身并不做审计),现在全球只有不到十个审核员,全部在美国。(测试价格昂贵的原因)

1.2 TPC目前推出的基准程序

TPC推出过11套基准程序,分别是正在使用的TPC-AppTPC-HTPC-CTPC-W,过时的TPC-ATPC-BTPC-DTPC-R,以及因为不被业界接受而放弃的TPC-S(Server专门测试基准程序)、TPC-E(大型企业信息服务测试基准程序)和TPC-Client/Server

2 TPC-H的目的

TPC-H主要目的是评价特定查询的决策支持能力,强调服务器在数据挖掘、分析处理方面的能力。查询是决策支持应用的最主要应用之一,数据仓库中的复杂查询可以分成两种类型:一种是预先知道的查询,如定期的业务报表;另一种则是事先未知的查询,称为动态查询(Ad-Hoc Query

通俗的讲,TPC-H就是当一家数据库开发商开发了一个新的数据库操作系统,采用TPC-H作为测试基准,来测试衡量数据库操作系统查询决策支持方面的能力

3 TPC-H的衡量指标

它模拟决策支持系统中的数据库操作,测试数据库系统复杂查询的响应时间,以每小时执行的查询数(TPC-H QphH@Siz)作为度量指标

4 TPC-H标准规范

4.1 数据库运行的环境条件

TPC-H测试模型为数据库服务器连续7×24小时工作,可能只有1次/月的维护;多用户并发执行复杂的动态查询,同时有并发执行表修改操作。数据库模型共有8张表,除NationRegion表外,其它表与测试的数据量有关,即比例因SF(Scale Factor)

数据库关系图以及表各个字段定义如下图:

tables

4.2 数据量规定

由于数据量的大小对查询速度有直接的影响,TPC-H标准对数据库系统中的数据量有严格、明确的规定。用SF描述数据量,1SF对应1GB单位,SF由低到高依次是110301003001000300010000。需要强调,SF规定的数据量只是8个基本表的数据量,不包括索引和临时表。

TPC-H测试全程来看,需要的数据存储空较大,一般包括有基本表、索引、临时表、数据文件和备份文件,基本表的大小为x;索引和临时空间的经验值为3-5倍,取上限5xDBGEN产生的数据文件的大小为x;备份文件大小为x;总计需要的存储空间为8x。就是说SF=1,需要准备8倍,即8GB存储空间,才能顺利地进行测试

4.3 22个查询语句

TPC-H测试围绕22SELECT语句展开,每个SELECT严格定义,遵守SQL-92语法,并且不允许用户修改。标准中从4个方面定义每个SELECT语句,即商业问题、SELECT的语法、参数和查询确认。这些SELECT语句的复杂程度超过大多数实际的OLTP应用,一个SELECT执行时间少则几十秒,多则达15小时以上,22个查询语句执行一遍需数个小时

4.4 2个更新操作

为了逼真地模拟数据仓库的实际应用环境,在22个查询执行的同时,还有一对更新操作RF1RF2并发地执行。RF1Order表和Lineitem表中插入原行数的0.1%的新行,模拟新销售业务的数据加入到数据库中;RF2Order表和Lineitem表中删除等量与RF1增加的数据,模拟旧的销售数据被淘汰。RF1RF2的执行必须保证数据库的ACID约束,并保持测试前后的数据库中的数据量不变。更新操作除输出成功或失败信息外,不产生其它输出信息

4.5 3个测试

TPC-H测试分解为3个子测试:数据装载测试、Power测试和Throughput测试。建立测试数据库的过程被称为装载数据,装载测试是为测试DBMS装载数据的能力。装载测试是第一项测试,测试装载数据的时间,这项操作非常耗时。Power测试是在数据装载测试完成后,数据库处于初始状态,未进行其它任何操作,特别是缓冲区还没有被测试数据库的数据,被称为raw查询。Power测试要求22个查询顺序执行1遍,同时执行一对RF1RF2操作。最后进行Throughput测试,也是最核心和最复杂的测试,它更接近于实际应用环境,与Power测试比对SUT系统的压力有非常大的增加,有多个查询语句组,同时有一对RF1RF2更新流

4.6 度量指标

测试中测量的基础数据都与执行时间有关,这些时间又可分为:装载数据的每一步操作时间、每个查询执行时间和每个更新操作执行时间,由这些时间可计算出:数据装载时间、Power@SizeThroughput@SizeQphH@SizeQphH@Size

4.6.1 装载数据时间

装载数据的全过程有记时操作和不记时操作之分,记时操作必须测量所用时间,并计入到数据装载时间中。一般情况下,需要记时的操作有建表、插入数据和建立索引

4.6.2 查询和更新时间

Power测试和Throughput测试中所有查询和更新流的时间必须被测量和记录,每个查询时间的计时是从被提交查询的第一个字符开始到获得查询结果最后一个字符的时间为止。更新时间要分别测量RF1RF2的时间,是从提交操作开始到完成操作结束的时间

4.6.3 Power@Size

Power@SizePower测试的结果,被定义为查询时间和更改时间的几何平均值的倒数,公式如下:

$$Power@Size=\frac{3600 \times SF}{\sqrt[24]{\prod_{i=1}^{i=22}{QI(i, 0) \times \prod_{j=1}^{j=2}{RI(j, 0)}}}}$$

其中:

  • Size为数据规模
  • SF为数据规模的比例因子
  • QI(i,0)为第i个查询的时间,以秒为单位
  • RI(j,0)为第j个更新的时间,以秒为单位

4.6.4 Throughput@Size

Throughput@SizeThroughput测试的结果,被定义为在测量间隔长度内执行的查询总数的比率,公式如下

$$Throughput@Size = \frac{S \times 22 \times 3600}{T_s \times SF} $$

4.6.5 QphH@Size

$$QphH@Size = \sqrt{Power@Size \times Throughput@Size}$$

5 实践

TPC Download Current Specs/Source中下载TCP-H相关的程序

5.1 编译安装

将上述源码包解压缩

1
2
cd dbgen
cp makefile.suite makefile

修改makefile文件中的CCDATABASEMACHINEWORKLOAD的变量的定义

1
2
3
4
CC      = gcc
DATABASE= MYSQL
MACHINE = LINUX
WORKLOAD = TPCH

修改tpcd.h,在最后增加几行宏定义

1
2
3
4
5
6
7
8
#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

编译,编译后会生成几个可执行文件

  • dbgen:数据生成工具
  • qgen:sql生成工具
1
make

重要文件以及目录:

  • dbgen/queries:查询语句模板
  • dbgen/dss.ddl:建表语句

5.2 生成数据

1
2
3
4
5
6
7
cd dbgen

# 生成1G大小的数据
./dbgen -s 1

# 查看生成后的数据
ls -lh *tbl

5.3 生成sql

1
2
3
4
5
6
7
cd dbgen

mkdir q
for id in `seq 1 22`
do
DSS_QUERY=./queries ./qgen ${id} > q/${id}.sql
done

注意,这样生成的sql,可能格式稍微有些出入,看情况修改就行

6 参考