TPCH

来源:互联网 发布:淘宝宝贝分类怎么设置 编辑:程序博客网 时间:2024/04/25 19:34

 

TPC简介

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

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

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

 

TPC目前推出的基准程序

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

这里重点介绍TCP-H。

TPC-H的目的

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

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

 

TPC-H的衡量指标

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

 

TPC-H标准规范

TPC- H 标准规范由10 章正文和5个附录组成。详细内容见:tpch2.14.4.docx

 

数据库运行的环境条件

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

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

具体表中各个字段的定义,请参阅TPC-H标准规范。

 

 

 

 

数据库模型

 

 

数据量规定

 

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

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

 

 

22 个查询语句

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

 

 

2 个更新操作

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

 

 

3 个测试

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

 

度量指标

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

 

 

装载数据时间

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

 

查询和更新时间

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

 

Power@Size

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

 

其中:Size为数据规模;SF为数据规模的比例因子;QIi0)为第 i个查询的时间,以秒为单位;RI j0)为 RFj更新的时间,以秒为单位。

 

Throughput@Size

 Throughput@SizeThroughput测试的结果,被定义为所有查询执行时间平均值的倒数,公式如下:

 

 

 

TPC- H 标准的附录D,有两组ANSI C语言源程序包,即DBGENQGENDBGEN用于产生被测试数据,用户通过命令行参数控制执行结果。QGEN用于生产测试所需要的22SELECTRF1RD2两个更新操作。

 

 

DBGEN QGEN程序

   TPC- H 标准的附录D,有两组ANSI C语言源程序包,即DBGENQGENDBGEN用于产生被测试数据,用户通过命令行参数控制执行结果。QGEN用于生产测试所需要的22SELECTRF1RD2两个更新操作。

n  详细使用说明

    http://www.geniiius.com/blog/generate-test-data-using-dbgen

 

 

你一步一步如何使用该工具来生成一个数据库,一套表的数据量足够大,能够证明性能优化的东西。

 

1 下载DBGEN

下载,DBGENhttp://www.tpc.org/tpch/spec/tpch_2_14_3.zip和提取它。 在本指南中,我的zip文件解压到C\ tpch_2_14_3 \

 

 


这是项目,我们需要建立可执行文件。

 

2 构建解决方案

现在,打开C\ \ DBGEN \ tpch.slnVisual Studiotpch_2_14_3 根据您的Visual Studio版本,你可能会面临着一个转换向导。 只需单击完成来执行转换。 所有你需要做的,是要建立完整的解决方案。 我有一些错误,因为一些锁定的文件,所以我必须手动删除所有文件从C\ tpch_2_14_3 \ DBGEN \ Debug文件夹之前,我可以编译解决方案。 结果是文件C\ tpch_2_14_3 \ DBGEN \调试\ dbgen.exe

 

3 生成数据使用dbgen.exe

现在需要执行dbgen.exe 如果我们执行该命令与-h,我们得到一些帮助:

 

如果我们简单地运行dbgen.exe,默认情况下,生成1 GB的数据,分为8个不同的表(客户,国家,订单项的订单,零件,PARTSUPP,地区,供应商)。 -s参数指定一个比例因子,所以-S 10为我们提供了10GB,和100生成100GB的数据。 让我们尝试缺省的:

哎呀,我们得到了一个错误! 这是为什么,我不知道,但我找到了解决办法很简单:将文件复制dbgen.exe,一个级别,所以它位于C\ tpch_2_14_3 \ DBGEN文件夹,然后再试一次:

 

-v给出详细的输出。 现在,它生成的文件为每个表。 根据您的系统的速度,这可能需要几分钟的时间。

生成的文件将位于相同的目录中dbgen.exe 生成的文件的列表是:

生成tbl文件后需要建立表,将数据导入,在数据库中建立表与表之间的关系。

 

在这里我将建表以及导入8个表的sql语句写出(仅适用于sqlserver2005其他数据库请具体参阅相关的产品的sql语句)

使用方式:

1》  创建数据库(名字自己定)

2》  在此数据库下,新建查询,将下列语句拷贝到对话框中,点击执行,便可以生成数据库(表结构,表之间的主外键关系都有了)。

SET ANSI_NULLSON

GO

SET QUOTED_IDENTIFIERON

GO

IF NOTEXISTS(SELECT*FROMsys.objectsWHEREobject_id=OBJECT_ID(N'[dbo].[REGION]')ANDtypein(N'U'))

BEGIN

CREATE TABLE [dbo].[REGION](

    [R_REGIONKEY] [int] NOT NULL,

    [R_NAME] [char](25)NOTNULL,

    [R_COMMENT] [varchar](152)NULL,

 CONSTRAINT [PK_REGION] PRIMARY KEY CLUSTERED

(

    [R_REGIONKEY] ASC

)WITH(PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY=OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON)ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLSON

GO

SET QUOTED_IDENTIFIERON

GO

IF NOTEXISTS(SELECT*FROMsys.objectsWHEREobject_id=OBJECT_ID(N'[dbo].[PART]')ANDtypein(N'U'))

BEGIN

CREATE TABLE [dbo].[PART](

    [P_PARTKEY] [int] NOT NULL,

    [P_NAME] [varchar](55)NOTNULL,

    [P_MFGR] [char](25)NOTNULL,

    [P_BRAND] [char](10)NOTNULL,

    [P_TYPE] [varchar](25)NOTNULL,

    [P_SIZE] [int] NOT NULL,

    [P_CONTAINER] [char](10)NOTNULL,

    [P_RETAILPRICE] [decimal](15, 2)NOTNULL,

    [P_COMMENT] [varchar](23)NOTNULL,

 CONSTRAINT [PK_PART] PRIMARY KEY CLUSTERED

(

    [P_PARTKEY] ASC

)WITH(PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY=OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON)ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLSON

GO

SET QUOTED_IDENTIFIERON

GO

IF NOTEXISTS(SELECT*FROMsys.objectsWHEREobject_id=OBJECT_ID(N'[dbo].[ORDERS]')ANDtypein(N'U'))

BEGIN

CREATE TABLE [dbo].[ORDERS](

    [O_ORDERKEY] [int] NOT NULL,

    [O_CUSTKEY] [int] NOT NULL,

    [O_ORDERSTATUS] [char](1)NOTNULL,

    [O_TOTALPRICE] [decimal](15, 2)NOTNULL,

    [O_ORDERDATE] [datetime] NOT NULL,

    [O_ORDERPRIORITY] [char](15)NOTNULL,

    [O_CLERK] [char](15)NOTNULL,

    [O_SHIPPRIORITY] [int] NOT NULL,

    [O_COMMENT] [varchar](79)NOTNULL,

 CONSTRAINT [PK_ORDERS_1] PRIMARY KEY CLUSTERED

(

    [O_ORDERKEY] ASC

)WITH(PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY=OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON)ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLSON

GO

SET QUOTED_IDENTIFIERON

GO

IF NOTEXISTS(SELECT*FROMsys.objectsWHEREobject_id=OBJECT_ID(N'[dbo].[LINEITEM]')ANDtypein(N'U'))

BEGIN

CREATE TABLE [dbo].[LINEITEM](

    [L_ORDERKEY] [int] NOT NULL,

    [L_PARTKEY] [int] NOT NULL,

    [L_SUPPKEY] [int] NOT NULL,

    [L_LINENUMBER] [int] NOT NULL,

    [L_QUANTITY] [decimal](15, 2)NOTNULL,

    [L_EXTENDEDPRICE] [decimal](15, 2)NOTNULL,

    [L_DISCOUNT] [decimal](15, 2)NOTNULL,

    [L_TAX] [decimal](15, 2)NOTNULL,

    [L_RETURNFLAG] [char](1)NOTNULL,

    [L_LINESTATUS] [char](1)NOTNULL,

    [L_SHIPDATE] [datetime] NOT NULL,

    [L_COMMITDATE] [datetime] NOTNULL,

    [L_RECEIPTDATE] [datetime] NOTNULL,

    [L_SHIPINSTRUCT] [char](25)NOTNULL,

    [L_SHIPMODE] [char](10)NOTNULL,

    [L_COMMENT] [varchar](44)NOTNULL

) ON [PRIMARY]

END

GO

SET ANSI_NULLSON

GO

SET QUOTED_IDENTIFIERON

GO

IF NOTEXISTS(SELECT*FROMsys.objectsWHEREobject_id=OBJECT_ID(N'[dbo].[CUSTOMER]')ANDtypein(N'U'))

BEGIN

CREATE TABLE [dbo].[CUSTOMER](

    [C_CUSTKEY] [int] NOT NULL,

    [C_NAME] [varchar](25)NOTNULL,

    [C_ADDRESS] [varchar](40)NOTNULL,

    [C_NATIONKEY] [int] NOT NULL,

    [C_PHONE] [char](15)NOTNULL,

    [C_ACCTBAL] [decimal](15, 2)NOTNULL,

    [C_MKTSEGMENT] [char](10)NOTNULL,

    [C_COMMENT] [varchar](117)NOTNULL,

 CONSTRAINT [PK_CUSTOMER] PRIMARY KEY CLUSTERED

(

    [C_CUSTKEY] ASC

)WITH(PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY=OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON)ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLSON

GO

SET QUOTED_IDENTIFIERON

GO

IF NOTEXISTS(SELECT*FROMsys.objectsWHEREobject_id=OBJECT_ID(N'[dbo].[SUPPLIER]')ANDtypein(N'U'))

BEGIN

CREATE TABLE [dbo].[SUPPLIER](

    [S_SUPPKEY] [int] NOT NULL,

    [S_NAME] [char](25)NOTNULL,

    [S_ADDRESS] [varchar](40)NOTNULL,

    [S_NATIONKEY] [int] NOT NULL,

    [S_PHONE] [char](15)NOTNULL,

    [S_ACCTBAL] [decimal](15, 2)NOTNULL,

    [S_COMMENT] [varchar](101)NOTNULL,

 CONSTRAINT [PK_SUPPLIER] PRIMARY KEY CLUSTERED

(

    [S_SUPPKEY] ASC

)WITH(PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY=OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON)ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLSON

GO

SET QUOTED_IDENTIFIERON

GO

IF NOTEXISTS(SELECT*FROMsys.objectsWHEREobject_id=OBJECT_ID(N'[dbo].[NATION]')ANDtypein(N'U'))

BEGIN

CREATE TABLE [dbo].[NATION](

    [N_NATIONKEY] [int] NOT NULL,

    [N_NAME] [char](25)NOTNULL,

    [N_REGIONKEY] [int] NOT NULL,

    [N_COMMENT] [varchar](152)NULL,

 CONSTRAINT [PK_NATION] PRIMARY KEY CLUSTERED

(

    [N_NATIONKEY] ASC

)WITH(PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY=OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON)ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLSON

GO

SET QUOTED_IDENTIFIERON

GO

IF NOTEXISTS(SELECT*FROMsys.objectsWHEREobject_id=OBJECT_ID(N'[dbo].[PARTSUPP]')ANDtypein(N'U'))

BEGIN

CREATE TABLE [dbo].[PARTSUPP](

    [PS_PARTKEY] [int] NOT NULL,

    [PS_SUPPKEY] [int] NOT NULL,

    [PS_AVAILQTY] [int] NOT NULL,

    [PS_SUPPLYCOST] [decimal](15, 2)NOTNULL,

    [PS_COMMENT] [varchar](199)NOTNULL,

 CONSTRAINT [PK_PARTSUPP] PRIMARY KEY CLUSTERED

(

    [PS_PARTKEY] ASC,

    [PS_SUPPKEY] ASC

)WITH(PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY=OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON)ON [PRIMARY]

) ON [PRIMARY]

END

GO

IF NOTEXISTS(SELECT*FROMsys.foreign_keysWHEREobject_id=OBJECT_ID(N'[dbo].[FK_ORDERS_CUSTOMER]')AND parent_object_id=OBJECT_ID(N'[dbo].[ORDERS]'))

ALTER TABLE [dbo].[ORDERS] WITHCHECKADD CONSTRAINT [FK_ORDERS_CUSTOMER]FOREIGNKEY([O_CUSTKEY])

REFERENCES [dbo].[CUSTOMER]([C_CUSTKEY])

GO

ALTER TABLE [dbo].[ORDERS]CHECKCONSTRAINT [FK_ORDERS_CUSTOMER]

GO

IF NOTEXISTS(SELECT*FROMsys.foreign_keysWHEREobject_id=OBJECT_ID(N'[dbo].[FK_LINEITEM_ORDERS]')AND parent_object_id=OBJECT_ID(N'[dbo].[LINEITEM]'))

ALTER TABLE [dbo].[LINEITEM] WITHNOCHECKADD CONSTRAINT [FK_LINEITEM_ORDERS]FOREIGNKEY([L_ORDERKEY])

REFERENCES [dbo].[ORDERS]([O_ORDERKEY])

GO

ALTER TABLE [dbo].[LINEITEM]CHECKCONSTRAINT [FK_LINEITEM_ORDERS]

GO

IF NOTEXISTS(SELECT*FROMsys.foreign_keysWHEREobject_id=OBJECT_ID(N'[dbo].[FK_LINEITEM_PARTSUPP]')AND parent_object_id=OBJECT_ID(N'[dbo].[LINEITEM]'))

ALTER TABLE [dbo].[LINEITEM] WITHNOCHECKADD CONSTRAINT [FK_LINEITEM_PARTSUPP]FOREIGNKEY([L_PARTKEY], [L_SUPPKEY])

REFERENCES [dbo].[PARTSUPP]([PS_PARTKEY], [PS_SUPPKEY])

GO

ALTER TABLE [dbo].[LINEITEM]CHECKCONSTRAINT [FK_LINEITEM_PARTSUPP]

GO

IF NOTEXISTS(SELECT*FROMsys.foreign_keysWHEREobject_id=OBJECT_ID(N'[dbo].[FK_CUSTOMER_NATION]')AND parent_object_id=OBJECT_ID(N'[dbo].[CUSTOMER]'))

ALTER TABLE [dbo].[CUSTOMER] WITHCHECKADD CONSTRAINT [FK_CUSTOMER_NATION]FOREIGNKEY([C_NATIONKEY])

REFERENCES [dbo].[NATION]([N_NATIONKEY])

GO

ALTER TABLE [dbo].[CUSTOMER]CHECKCONSTRAINT [FK_CUSTOMER_NATION]

GO

IF NOTEXISTS(SELECT*FROMsys.foreign_keysWHEREobject_id=OBJECT_ID(N'[dbo].[FK_SUPPLIER_NATION]')AND parent_object_id=OBJECT_ID(N'[dbo].[SUPPLIER]'))

ALTER TABLE [dbo].[SUPPLIER] WITHCHECKADD CONSTRAINT [FK_SUPPLIER_NATION]FOREIGNKEY([S_NATIONKEY])

REFERENCES [dbo].[NATION]([N_NATIONKEY])

GO

ALTER TABLE [dbo].[SUPPLIER]CHECKCONSTRAINT [FK_SUPPLIER_NATION]

GO

IF NOTEXISTS(SELECT*FROMsys.foreign_keysWHEREobject_id=OBJECT_ID(N'[dbo].[FK_NATION_REGION]')AND parent_object_id=OBJECT_ID(N'[dbo].[NATION]'))

ALTER TABLE [dbo].[NATION] WITHCHECKADD CONSTRAINT [FK_NATION_REGION]FOREIGNKEY([N_REGIONKEY])

REFERENCES [dbo].[REGION]([R_REGIONKEY])

GO

ALTER TABLE [dbo].[NATION]CHECKCONSTRAINT [FK_NATION_REGION]

GO

IF NOTEXISTS(SELECT*FROMsys.foreign_keysWHEREobject_id=OBJECT_ID(N'[dbo].[FK_PARTSUPP_PART]')AND parent_object_id=OBJECT_ID(N'[dbo].[PARTSUPP]'))

ALTER TABLE [dbo].[PARTSUPP] WITHCHECKADD CONSTRAINT [FK_PARTSUPP_PART]FOREIGNKEY([PS_PARTKEY])

REFERENCES [dbo].[PART]([P_PARTKEY])

GO

ALTER TABLE [dbo].[PARTSUPP]CHECKCONSTRAINT [FK_PARTSUPP_PART]

GO

IF NOTEXISTS(SELECT*FROMsys.foreign_keysWHEREobject_id=OBJECT_ID(N'[dbo].[FK_PARTSUPP_SUPPLIER]')AND parent_object_id=OBJECT_ID(N'[dbo].[PARTSUPP]'))

ALTER TABLE [dbo].[PARTSUPP] WITHCHECKADD CONSTRAINT [FK_PARTSUPP_SUPPLIER]FOREIGNKEY([PS_SUPPKEY])

REFERENCES [dbo].[SUPPLIER]([S_SUPPKEY])

GO

ALTER TABLE [dbo].[PARTSUPP]CHECKCONSTRAINT [FK_PARTSUPP_SUPPLIER]

3

dbgen生成的 8个表的.tbl文件导入到数据库中。

1.   GO  
2.   BULK INSERT part FROM 'C:\tpch_2_14_3\dbgen\part.tbl' WITH (TABLOCK, DATAFILETYPE='char', CODEPAGE='raw', FIELDTERMINATOR = '|')  
3.   BULK INSERT customer FROM 'C:\tpch_2_14_3\dbgen\customer.tbl' WITH (TABLOCK, DATAFILETYPE='char', CODEPAGE='raw', FIELDTERMINATOR = '|')  
4.   BULK INSERT orders FROM 'C:\tpch_2_14_3\dbgen\orders.tbl' WITH (TABLOCK, DATAFILETYPE='char', CODEPAGE='raw', FIELDTERMINATOR = '|')  
5.   BULK INSERT partsupp FROM 'C:\tpch_2_14_3\dbgen\partsupp.tbl' WITH (TABLOCK, DATAFILETYPE='char', CODEPAGE='raw', FIELDTERMINATOR = '|')  
6.   BULK INSERT supplier FROM 'c:\tpch_2_14_3\dbgen\supplier.tbl' WITH (TABLOCK, DATAFILETYPE='char', CODEPAGE='raw', FIELDTERMINATOR = '|')  
7.   BULK INSERT lineitem FROM 'C:\tpch_2_14_3\dbgen\lineitem.tbl' WITH (TABLOCK, DATAFILETYPE='char', CODEPAGE='raw', FIELDTERMINATOR = '|')  
8.   BULK INSERT nation FROM 'C:\tpch_2_14_3\dbgen\nation.tbl' WITH (TABLOCK, DATAFILETYPE='char', CODEPAGE='raw', FIELDTERMINATOR = '|')  
9.   BULK INSERT region FROM 'C:\tpch_2_14_3\dbgen\region.tbl' WITH (TABLOCK, DATAFILETYPE='char', CODEPAGE='raw', FIELDTERMINATOR = '|')  

至此为止,dbgen生成的数据库全部内容已经导入到DBMS中。接下来,我们需要生成sql语句。这就需要用到qgen.

 

 

关于qgen的使用类似于dbgen

首先我们打开22个查询语句中的第一个

看到:

 

 

Qgen的其中一大作用就是将22条查询语句中的冒号替换为查询的数据,通过此方式来测试数据库的性能。

我们首先用qgen来生成第一条查询语句,并将其保存到上级目录的saveSql中。

运行

qgen -d 1>..\saveSql\1.sql

saveSql文件夹中,可以看到已经有一个1.sql语句,打开看一下。

select

    l_returnflag,

    l_linestatus,

    sum(l_quantity)as sum_qty,

    sum(l_extendedprice)as sum_base_price,

    sum(l_extendedprice*(1- l_discount))as sum_disc_price,

    sum(l_extendedprice*(1- l_discount)*(1+ l_tax))as sum_charge,

    avg(l_quantity)as avg_qty,

    avg(l_extendedprice)as avg_price,

    avg(l_discount)as avg_disc,

    count(*)as count_order

from

    lineitem

where

    l_shipdate <= date '1998-12-01' - interval '90' day (3)

group by

    l_returnflag,

    l_linestatus

order by

    l_returnflag,

    l_linestatus;

set rowcount-1

 

注意到 原来的“:”已经被替换为90.

接下来的工作我们需要将保存的sql语句,利用自己开发的测试工具来进行测试。

对于如何编写测试测试工具,我在这里不做介绍。给大家推荐几个国内较好论文,希望有所帮助。

 

http://wenku.baidu.com/view/46a99819a76e58fafab0035d.html

http://wenku.baidu.com/view/6df300aad1f34693daef3e18.html

http://wenku.baidu.com/view/b649f3c39ec3d5bbfd0a7454.html

TPC-H中文文档翻译(2.0.0.0版本)

http://wenku.baidu.com/view/024e682cbd64783e09122bf4.html

http://space.itpub.net/24435147/viewspace-694527

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击