在PostgreSQL上安裝TPC-H(其他數據庫也適用)

1、下載tpch
在這個網站下載:
https://github.com/electrum/tpch-dbgen
解壓:
unzip tpch_2_16_0v1.zip

2、安裝tpch
$cd tpch_2_17_0/dbgen
$vim makefile.suite
更改其中參數:
CC = gcc
DATABASE =SQLSERVER
VECTORWISE =LINUX
WORKLOAD =TPCH

3、安裝
$make

4、生成1G的數據
./dbgen -s 1 -f -T L

5、連接PG數據庫test(用postgres用戶)
/psql test

6、創建表
創建表語句在dss.dll中,找到打開並複製
gedit dss.dll
將複製的創建表語句黏貼出來:

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);

7、加工數據
1)將測試數據轉換爲postgresql識別的格式,刪除末尾的分隔符|
$for i in `ls *.tbl`; do sed ‘s/|$//’ $i > ${i/tbl/csv}; done
2)查看剛纔另存爲csv格式的數據是否存在
$ll -rth *.csv
3)把包含csv文件的目錄,軟鏈接到/tmp/dss-data。tpch-pg腳本中一會要用到這個目錄
\$pwd
/home/digoal/tpch/tpch_2_17_0/dbgen
\$ln -s /home/digoal/tpch/tpch_2_17_0/dbgen /tmp/dss-data

8、導入數據

test=# \copy customer from '/home/scidb/Downloads/tpch-dbgen-master/customer.csv'with CSV DELIMITER '|';
COPY 150000
test=# \copy supplier from '/home/scidb/Downloads/tpch-dbgen-master/supplier.csv'with CSV DELIMITER '|';
COPY 10000
test=# \copy nation from '/home/scidb/Downloads/tpch-dbgen-master/nation.csv'with CSV DELIMITER '|';
COPY 25
test=# \copy region from '/home/scidb/Downloads/tpch-dbgen-master/region.csv'with CSV DELIMITER '|';
COPY 5
test=# \copy part from '/home/scidb/Downloads/tpch-dbgen-master/part.csv'with CSV DELIMITER '|';
COPY 200000
test=# \copy partsupp from '/home/scidb/Downloads/tpch-dbgen-master/partsupp.csv'with CSV DELIMITER '|';
COPY 800000
test=# \copy order from '/home/scidb/Downloads/tpch-dbgen-master/order.csv'with CSV DELIMITER '|';
/home/scidb/Downloads/tpch-dbgen-master/order.csv: No such file or directory
test=# \copy orders from '/home/scidb/Downloads/tpch-dbgen-master/orders.csv'with CSV DELIMITER '|';
COPY 1500000
test=# \copy lineitem from '/home/scidb/Downloads/tpch-dbgen-master/lineitem.csv'with CSV DELIMITER '|';
COPY 6001215

9、報錯
ERROR: could not open file “/home/scidb/Downloads/tpch-dbgen-master/customer.csv” for reading: Permission denied
解決:(全用過,不知道哪個管用了,都寫下來)
1) chmod a+rX /home/scidb/Downloads /home/scidb/Downloads/tpch-dbgen-master /home/scidb/Downloads/tpch-dbgen-master/customer.csv
2) chown postgres /home/scidb/Downloads/tpch-dbgen-master/customer.csv
3)最重要的是不能直接寫copy!要寫/copy!

10、添加外鍵、主鍵
載入數據後,就可以添加外鍵、主鍵;對每張表添加外鍵、主鍵,修改tpch-dbgen文件夾中的dss.ri(用文本編輯器打開),將添加外鍵和主鍵的信息都按照以下修改,並註釋掉圖上的connect to tpcd
這裏寫圖片描述

-- For table REGION
ALTER TABLE REGION
ADD PRIMARY KEY (R_REGIONKEY);

-- For table NATION
ALTER TABLE NATION
ADD PRIMARY KEY (N_NATIONKEY);

ALTER TABLE NATION
ADD FOREIGN KEY (N_REGIONKEY) references REGION;

COMMIT WORK;

-- For table PART
ALTER TABLE PART
ADD PRIMARY KEY (P_PARTKEY);

COMMIT WORK;

-- For table SUPPLIER
ALTER TABLE SUPPLIER
ADD PRIMARY KEY (S_SUPPKEY);

ALTER TABLE SUPPLIER
ADD FOREIGN KEY (S_NATIONKEY) references NATION;

COMMIT WORK;

-- For table PARTSUPP
ALTER TABLE PARTSUPP
ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY);

COMMIT WORK;

-- For table CUSTOMER
ALTER TABLE CUSTOMER
ADD PRIMARY KEY (C_CUSTKEY);

ALTER TABLE CUSTOMER
ADD FOREIGN KEY (C_NATIONKEY) references NATION;

COMMIT WORK;

-- For table LINEITEM
ALTER TABLE LINEITEM
ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER);

COMMIT WORK;

-- For table ORDERS
ALTER TABLE ORDERS
ADD PRIMARY KEY (O_ORDERKEY);

COMMIT WORK;

-- For table PARTSUPP
ALTER TABLE PARTSUPP
ADD FOREIGN KEY (PS_SUPPKEY) references SUPPLIER;

COMMIT WORK;

ALTER TABLE PARTSUPP
ADD FOREIGN KEY (PS_PARTKEY) references PART;

COMMIT WORK;

-- For table ORDERS
ALTER TABLE ORDERS
ADD FOREIGN KEY (O_CUSTKEY) references CUSTOMER;

COMMIT WORK;

-- For table LINEITEM
ALTER TABLE LINEITEM
ADD FOREIGN KEY (L_ORDERKEY)  references ORDERS;

COMMIT WORK;

ALTER TABLE LINEITEM
ADD FOREIGN KEY (L_PARTKEY,L_SUPPKEY) references PARTSUPP;

COMMIT WORK;

11、測試語句
1)創建一個queries目錄,用於存放轉換後的tpc-h 測試SQL
$mkdir dss/queries
2)生成測試SQL

$for q in `seq 1 22`
do
    DSS_QUERY=dss/templates ./qgen $q >> dss/queries/$q.sql
    sed 's/^select/explain select/' dss/queries/$q.sql > dss/queries/$q.explain.sql
    cat dss/queries/$q.sql >> dss/queries/$q.explain.sql;
done

12、就完成了
查看錶中的信息是否修改\d cunstomer

參考文獻:
1、http://blog.163.com/digoal@126/blog/static/16387704020151019111930303/
2、http://www.it165.net/database/html/201604/15072.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章