benchmark TPC-H postgreSQL

  • Post author:
  • Post category:其他


写在前面:

个人对TPCH benchma的理解。我接到这个任务的时候,描述是这样的,“××呀,用benchMarke生成TPC-H然后测试一下”。我第一反应就是benchMark是什么,TPCH是什么。现在把这个弄完一遍后来说一下我的理解。



首先什么是TPC-H?

包括:八张定义好的表(也就是八个create语句)、表中的一条条的数据(比如”张三,1997-12-25,‘江苏’,98)、22条SQL语句。



TPC-H能干什么?

用来测试数据库管理系统的性能。浅显的举例子,比如现在有个项目要用数据库,备选的有MySQL、postgreSQL、张三公司开发的zsDB。指标就是要一个查询的快的数据库。这时候就可以用TPC-H的创建表的语句在三个数据库中创建同样的表,然后都导入TPC-H生成的1TB的记录数据,然后运行同样的TPC-H的22条SQL语句,在三个变量都相同的情况下,看最后哪个数据库跑完22条语句用的平均时间最短。根据结果选出一个来用。



我们用TPC-H需要干什么?怎么用?

不同的数据库的SQL语句语法上有差别,所以我们需要告诉TPC-H我们需要测试什么数据库,让他生成对应数据库的表创建语句,约束语句,SQL语句等。而且根据不同的情况需要生成不同大小的数据,比如1G,100G,1TB等等,就干这么个事



什么是benchMark

说实话,我现在也没理解。感觉是benchMark是一个集合。比如测试数据库除了 TPC-H 还有TPC-DS等等,还有测试cpu性能的什么的,所有的这些标准的大家都认可的测试集,称之为benchMark。(纯属个人理解,如果错误,欢迎批评指正,万分感谢)


参考文献在末尾



1.下载TPC-H的文件夹


TPC-H压缩包官网地址


在这里插入图片描述

在这里插入图片描述

注意:下载时需要填写邮箱,然后会发一个下载地址到邮箱里,邮箱地址只能下载一次,下一次下载需要再填一次邮箱,到新的地址下载。

如果是linux 可以用wget命令等下载,也可以在Windows下下载之后传输到Linux上,百度一下如何将文件传输到服务器上。或者用WinS C P可以很方便的传输文件



2.解压压缩包

在这里插入图片描述

(这个压缩包的名字很长,我自己改了下名字)

解压后如下

在这里插入图片描述



3.编译

在这里插入图片描述



①将makefile.suite 的复制到 makefile

在这里插入图片描述



②修改makefile文件

在这里插入图片描述

在这里插入图片描述

键盘输入 i 键入插入模式

在这里插入图片描述

完成后 按 Esc进入命令模式 输入 :wq 保存并退出



③修改dbgen目录下的tpcd.h文件

注意:如果DATABASE这里填的是红框里已有的数据库就不用进行这一步了,我用的是postgreSQL这里没有,所以需要进行这一步。向tpcd.h中添加下面的内容。

#ifdef POSTGRESQL
#define GEN_QUERY_PLAN  "EXPLAIN"
#define START_TRAN      "BEGIN TRANSACTION"
#define END_TRAN        "COMMIT;"
#define SET_OUTPUT      ""
#define SET_ROWCOUNT    "LIMIT %d\n"
#define SET_DBASE       ""
#endif



④编译 不管需不需要步骤③都需要编译 make

在这里插入图片描述
编译完成后会在当前目录下生成dbgen



4.产生数据 (数据就是数据库中一行一行的记录)

./dbgen -s 1 -f

在这里插入图片描述

-s 1 表示产生1GB的数据 -f 表示复制原来的数据

可以灵活修改这些参数 比如 ./dbgen -s 100生成100G的数据

将数据移到一个单独的目录

在这里插入图片描述

pwd Linux查看当前文件绝对路径的命令

向数据库中导入数据时要注意,需要把 .tbl文件中每一行后面的 | 这个竖线符号去掉,不然会报错。至于怎么去掉,我是自己写了python程序

import os
#去除文件夹data1g中的文件中每一列最后一行的 ‘|’
#讲去除后的内容写入文件夹 2data1g对应的文件中

for root in os.listdir('data1g'):
    f = open('data1g' + '//' + root, 'r')
    w = open('2data1g' + '//' + '1' + root, 'w')
    for i in f:
        length = len(i) - 2
        if ('|' == i[length]):
            j = i[:length] + "\n"
            w.write(j)
    f.close()
    w.close()

处理完的数据在2data1g这个文件夹里面。

我是用WinSCP 先将服务器里的data1g文件拖拽到windows本地处理,处理完之后将2data1g的文件夹拖拽到服务器上原来data1g文件夹所在的位置

如果有

权限问题

,比如数据库在某个用户下,然后winSCP拖拽文件时是另一个用户登录的比如root用户,又可能在下面用命令运行数据库的时候产生错误,也可能在对文件进行操作时出现无法操作的问题。可以用chmod命令修改文件所属的用户(出现对应问题时上网查看命令的具体使用)



5.生成查询语句

到queries文件夹下

TPC-H_Tools_v3.0.0/dbgen/queries

在这里插入图片描述

queries文件夹原来长这样

在这里插入图片描述

需要将qgen 和 dists.dss复制到queries目录下

注意下方命令 cp 源文件路径 目的文件路径

所以下面第一条命令前一个qgen 和后一个 qgen之间有一个空格哦

dists.dss也是这样

在这里插入图片描述

生成查询语句,注意这里有22个所有只能生成22个

会写批处理的可以用批处理,我不会,所以我就一行行写写了22行

./qgen -d 1 > d1.sql
./qgen -d 2 > d2.sql
./qgen -d 3 > d3.sql
./qgen -d 4 > d4.sql
./qgen -d 5 > d5.sql
./qgen -d 6 > d6.sql
./qgen -d 7 > d7.sql
./qgen -d 8 > d8.sql
./qgen -d 9 > d9.sql
./qgen -d 10 > d10.sql
./qgen -d 11 > d11.sql
./qgen -d 12 > d12.sql
./qgen -d 13 > d13.sql
./qgen -d 14 > d14.sql
./qgen -d 15 > d15.sql
./qgen -d 16 > d16.sql
./qgen -d 17 > d17.sql
./qgen -d 18 > d18.sql
./qgen -d 19 > d19.sql
./qgen -d 20 > d20.sql
./qgen -d 21 > d21.sql
./qgen -d 22 > d22.sql

在这里插入图片描述



6.数据库操作

此处根据数据库不同命令也有差别

我用的是poatgres-XL



①连接数据库



②建立数据库

create databse tpch; //创建数据库tpch
drop database tpch;  //删除数据库tpch
\l //(L的小写) 显示当前都有哪些数据库
\c tpch //进入数据库



③创建表

创建表的sql语句在TPC-H_Tools_v3.0.0/dbgen下的 dss.ddl

CREATE TABLE NATION  ( N_NATIONKEY  INTEGER NOT NULL,
                            N_NAME       CHAR(25) NOT NULL,
                            N_REGIONKEY  INTEGER NOT NULL,
                            N_COMMENT    VARCHAR(152));

CREATE TABLE REGION  ( R_REGIONKEY  INTEGER NOT NULL,
                            R_NAME       CHAR(25) NOT NULL,
                            R_COMMENT    VARCHAR(152));

CREATE TABLE PART  ( P_PARTKEY     INTEGER NOT NULL,
                          P_NAME        VARCHAR(55) NOT NULL,
                          P_MFGR        CHAR(25) NOT NULL,
                          P_BRAND       CHAR(10) NOT NULL,
                          P_TYPE        VARCHAR(25) NOT NULL,
                          P_SIZE        INTEGER NOT NULL,
                          P_CONTAINER   CHAR(10) NOT NULL,
                          P_RETAILPRICE DECIMAL(15,2) NOT NULL,
                          P_COMMENT     VARCHAR(23) NOT NULL );

CREATE TABLE SUPPLIER ( S_SUPPKEY     INTEGER NOT NULL,
                             S_NAME        CHAR(25) NOT NULL,
                             S_ADDRESS     VARCHAR(40) NOT NULL,
                             S_NATIONKEY   INTEGER NOT NULL,
                             S_PHONE       CHAR(15) NOT NULL,
                             S_ACCTBAL     DECIMAL(15,2) NOT NULL,
                             S_COMMENT     VARCHAR(101) NOT NULL);

CREATE TABLE PARTSUPP ( PS_PARTKEY     INTEGER NOT NULL,
                             PS_SUPPKEY     INTEGER NOT NULL,
                             PS_AVAILQTY    INTEGER NOT NULL,
                             PS_SUPPLYCOST  DECIMAL(15,2)  NOT NULL,
                             PS_COMMENT     VARCHAR(199) NOT NULL );

CREATE TABLE CUSTOMER ( C_CUSTKEY     INTEGER NOT NULL,
                             C_NAME        VARCHAR(25) NOT NULL,
                             C_ADDRESS     VARCHAR(40) NOT NULL,
                             C_NATIONKEY   INTEGER NOT NULL,
                             C_PHONE       CHAR(15) NOT NULL,
                             C_ACCTBAL     DECIMAL(15,2)   NOT NULL,
                             C_MKTSEGMENT  CHAR(10) NOT NULL,
                             C_COMMENT     VARCHAR(117) NOT NULL);

CREATE TABLE ORDERS  ( O_ORDERKEY       INTEGER NOT NULL,
                           O_CUSTKEY        INTEGER NOT NULL,
                           O_ORDERSTATUS    CHAR(1) NOT NULL,
                           O_TOTALPRICE     DECIMAL(15,2) NOT NULL,
                           O_ORDERDATE      DATE NOT NULL,
                           O_ORDERPRIORITY  CHAR(15) NOT NULL,  
                           O_CLERK          CHAR(15) NOT NULL, 
                           O_SHIPPRIORITY   INTEGER NOT NULL,
                           O_COMMENT        VARCHAR(79) NOT NULL);

CREATE TABLE LINEITEM ( L_ORDERKEY    INTEGER NOT NULL,
                             L_PARTKEY     INTEGER NOT NULL,
                             L_SUPPKEY     INTEGER NOT NULL,
                             L_LINENUMBER  INTEGER NOT NULL,
                             L_QUANTITY    DECIMAL(15,2) NOT NULL,
                             L_EXTENDEDPRICE  DECIMAL(15,2) NOT NULL,
                             L_DISCOUNT    DECIMAL(15,2) NOT NULL,
                             L_TAX         DECIMAL(15,2) NOT NULL,
                             L_RETURNFLAG  CHAR(1) NOT NULL,
                             L_LINESTATUS  CHAR(1) NOT NULL,
                             L_SHIPDATE    DATE NOT NULL,
                             L_COMMITDATE  DATE NOT NULL,
                             L_RECEIPTDATE DATE NOT NULL,
                             L_SHIPINSTRUCT CHAR(25) NOT NULL,
                             L_SHIPMODE     CHAR(10) NOT NULL,
                             L_COMMENT      VARCHAR(44) NOT NULL);



④添加约束

约束(主键、外键)在dss.ri文件中

因为不知名原因外键添加不成功,所以我就直接删除了文件中外键的添加



⑤导入数据 注意路径

\copy customer from '/tpch/TPC-H_Tools_v3.0.0/2data1g/1customer.tbl' with delimiter as '|' NULL ' ';
\copy lineitem from '/tpch/TPC-H_Tools_v3.0.0/2data1g/1lineitem.tbl' with delimiter as '|' NULL ' ';
\copy nation from '/tpch/TPC-H_Tools_v3.0.0/2data1g/1nation.tbl' with delimiter as '|' NULL ' ';
\copy orders from '/tpch/TPC-H_Tools_v3.0.0/2data1g/1orders.tbl' with delimiter as '|' NULL ' ';
\copy part from '/tpch/TPC-H_Tools_v3.0.0/2data1g/1part.tbl' with delimiter as '|' NULL ' ';
\copy partsupp from '/tpch/TPC-H_Tools_v3.0.0/2data1g/1partsupp.tbl' with delimiter as '|' NULL ' ';
\copy region from '/tpch/TPC-H_Tools_v3.0.0/2data1g/1region.tbl' with delimiter as '|' NULL ' ';
\copy supplier from '/tpch/TPC-H_Tools_v3.0.0/2data1g/1supplier.tbl' with delimiter as '|' NULL ' ';



⑥运行sql语句

参考文献

https://blog.csdn.net/iteapoy/article/details/104214119

https://blog.csdn.net/m0_37852301/article/details/120886897

https://www.cnblogs.com/littlesuccess/p/3840594.html

https://www.cnblogs.com/joyeecheung/p/3599698.html

https://www.cnblogs.com/yongzhewudi/p/5371396.html

希望大家科研顺利、工作顺利、不要出现莫名其妙的ERROR



版权声明:本文为nyyngh原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。