PostgreSQL导入TPC-H测试集

PostgreSQL导入TPC-H测试集

本机环境:WSL2 Ubuntu20.04

1 工具准备

electrum/tpch-dbgen: TPC-H dbgen (github.com)

git clone git@github.com:electrum/tpch-dbgen.git
cd tpch-dbgen
make -j #自行准备好C的编译环境

编译完成后,会生成dbgen和qgen可执行文件,分别用于生成测试数据和SQL,本文介绍dbgen的使用

image-20230821163454753

2 生成测试数据

dbgen的使用可通过./dbgen -help获取,本文生成1GB的测试数据:

./dbgen -vf -s 1

目录下会生成8个表的tbl数据,以.tbl结尾。生成的tbl数据每一行的末尾会有一个“|”,导致PG数据库读取时报错,需要将最后一个“|”去掉。写一个脚本process.sh进行处理,内容如下:

for i in `ls *.tbl`
do
 name="tbl/$i"
 echo $name
 `touch $name`
 `chmod 777 $name`
 sed 's/|$//' $i >> $name;
done

执行完脚本后,会将处理后的数据文件放到tbl目录下,记住该目录的位置供导入使用

3 导入数据

首先,登入pg数据库,建立tpch数据库,然后建表,建表语句可参考dss.ddl文件,直接复制执行:

-- Sccsid:     @(#)dss.ddl	2.1.8.1
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);

然后导入数据,在PG中执行如下语句,将from后的目录换成自己的路径:

copy region from '/home/hpq/tpch-dbgen/tbl/region.tbl' with delimiter as '|' NULL '';
copy nation from '/home/hpq/tpch-dbgen/tbl/nation.tbl' with delimiter as '|' NULL '';
copy partsupp from '/home/hpq/tpch-dbgen/tbl/partsupp.tbl' with delimiter as '|' NULL '';
copy customer from '/home/hpq/tpch-dbgen/tbl/customer.tbl' with delimiter as '|' NULL '';
copy lineitem from '/home/hpq/tpch-dbgen/tbl/lineitem.tbl' with delimiter as '|' NULL '';
copy orders from '/home/hpq/tpch-dbgen/tbl/orders.tbl' with delimiter as '|' NULL '';
copy part from '/home/hpq/tpch-dbgen/tbl/part.tbl' with delimiter as '|' NULL '';
copy supplier from '/home/hpq/tpch-dbgen/tbl/supplier.tbl' with delimiter as '|' NULL '';

4 导入主键和外键

见dss.ri文件,为了适配pg需要做处理,或者直接执行下面的语句:

ALTER TABLE REGION ADD PRIMARY KEY (R_REGIONKEY);
ALTER TABLE NATION ADD PRIMARY KEY (N_NATIONKEY);
ALTER TABLE PART ADD PRIMARY KEY (P_PARTKEY);
ALTER TABLE SUPPLIER ADD PRIMARY KEY (S_SUPPKEY);
ALTER TABLE PARTSUPP ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY);
ALTER TABLE CUSTOMER ADD PRIMARY KEY (C_CUSTKEY);
ALTER TABLE LINEITEM ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER);
ALTER TABLE ORDERS ADD PRIMARY KEY (O_ORDERKEY);

ALTER TABLE NATION ADD FOREIGN KEY (N_REGIONKEY) references REGION;
ALTER TABLE SUPPLIER ADD FOREIGN KEY (S_NATIONKEY) references NATION;
ALTER TABLE CUSTOMER ADD FOREIGN KEY (C_NATIONKEY) references NATION;
ALTER TABLE PARTSUPP ADD FOREIGN KEY (PS_SUPPKEY) references SUPPLIER;
ALTER TABLE PARTSUPP ADD FOREIGN KEY (PS_PARTKEY) references PART;
ALTER TABLE ORDERS ADD FOREIGN KEY (O_CUSTKEY) references CUSTOMER;
ALTER TABLE LINEITEM ADD FOREIGN KEY (L_ORDERKEY)  references ORDERS;
ALTER TABLE LINEITEM ADD FOREIGN KEY (L_PARTKEY,L_SUPPKEY) references PARTSUPP;

5 查询语句

github项目中的queries文件夹中以及提供了22类查询,有关介绍参见:TPC-H(二):22个SQL语句说明(基于TPC-H2.17.3版本)_LCYong_的博客-CSDN博客

Q01 统计查询

Q02 WHERE条件中,使用子查询(=)

Q03 多表关联统计查询,并统计(SUM)

Q04 WHERE条件中,使用子查询(EXISTS),并统计(COUNT)

Q05 多表关联查询(=),并统计(SUM)

Q06 条件(BETWEEN AND)查询,并统计(SUM)

Q07 带有FROM子查询,从结果集中统计(SUM)

Q08 带有FROM多表子查询,从结果集中的查询列上带有逻辑判断(WHEN THEN ELSE)的统计(SUM)

Q09 带有FROM多表子查询,查询表中使用函数(EXTRACT),从结果集中统计(SUM)

Q10 多表条件查询(>=, <),并统计(SUM)

Q11 在GROUP BY中使用比较条件(HAVING >),比较值从子查询中查出

Q12 带有逻辑判断(WHEN AND/ WHEN OR)的查询,并统计(SUM)

Q13 带有FROM子查询,子查询中使用外联结

Q14 使用逻辑判断(WHEN ELSE)的查询

Q15 使用视图和表关联查询

Q16 在WHERE子句中使用子查询,使用IN/ NOT IN判断条件,并统计(COUNT)

Q17 在WHERE子句中使用子查询,使用<比较,使用了AVG函数

Q18 在WHERE子句中使用IN条件从子查询结果中比较

Q19 多条件比较查询

Q20 WHERE条件子查询(三层)

Q21 在WHERE条件中使用子查询,使用EXISTS和NOT EXISTS判断

Q22 在WHERE条件中使用判断子查询、IN、NOT EXISTS,并统计(SUM、COUNT)查询结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值