一、Linux下使用DBGEN 和QGEN 程序创建数据与查询脚本
1、下载工具压缩包
http://www.tpc.org/tpc_documents_current_versions/current_specifications.asp
2、将压缩包放置到指定目录下,解压压缩包
unzip tpc-h-tool.zip
3、修改makefile文件内容
--在CC后填写gcc
--在DATABASE后填写Oracle
--在MACHINE后填写LINUX
--在WORKLOAD后填写TPCH
################
## CHANGE NAME OF ANSI COMPILER HERE
################
CC = gcc
# Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)
# SQLSERVER, SYBASE, ORACLE, VECTORWISE
# Current values for MACHINE are: ATT, DOS, HP, IBM, ICL, MVS,
# SGI, SUN, U2200, VMS, LINUX, WIN32
# Current values for WORKLOAD are: TPCH
DATABASE=ORACLE
MACHINE = LINUX
WORKLOAD = TPCH
4、执行编译
make
5、执行数据生成操作
-- -s后填写的是SF的数量,TPC- H 中使用SF 描述数据量,1SF 对应1 GB 单位,SF 由低到高依次是1、10、30、100、300、1 000、3 000、10 000。
-- time是输出产生数据的时间,可以忽略直接写为./dbgen -s 1 -vf
time ./dbgen -s 1 -vf
6、生成查询测试脚本
将默认脚本克隆到qgen程序的同级目录,执行./qgen,-s后填写的是SF的数量,不同的SF生成查询sql中的参数值会有所不同。使用DATABASE=ORACLE 编译的程序生成脚本只需改动一点即可通用于所需测试的三个数据库,因此不建议多次编译用于生成对应数据库脚本(试过在不同目录下解压编译,因创建查询脚本时使用的seed值不一样,相同的SF值生成脚本参数不一致)。
[root@dn210120 dbgen]# cp ./queries/*.sql ./
[root@dn210120 dbgen]# ./qgen -s 1 > query.sql
二、Oracle导入数据与脚本处理
1、Oracle建表脚本
CREATE TABLE PART (
P_PARTKEY INT NOT NULL,
P_NAME VARCHAR2(55),
P_MFGR CHAR(25),
P_BRAND CHAR(10),
P_TYPE VARCHAR2(25),
P_SIZE INTEGER,
P_CONTAINER CHAR(10),
P_RETAILPRICE DECIMAL,
P_COMMENT VARCHAR2(23)
);
CREATE TABLE NATION (
N_NATIONKEY INT NOT NULL,
N_NAME CHAR(25),
N_REGIONKEY INTEGER NOT NULL, -- references R_REGIONKEY
N_COMMENT VARCHAR2(152)
);
CREATE TABLE SUPPLIER (
S_SUPPKEY INT NOT NULL,
S_NAME CHAR(25),
S_ADDRESS VARCHAR2(40),
S_NATIONKEY INTEGER NOT NULL, -- references N_NATIONKEY
S_PHONE CHAR(15),
S_ACCTBAL DECIMAL,
S_COMMENT VARCHAR2(101)
);
CREATE TABLE PARTSUPP (
PS_PARTKEY INTEGER NOT NULL, -- references P_PARTKEY
PS_SUPPKEY INTEGER NOT NULL, -- references S_SUPPKEY
PS_AVAILQTY INTEGER,
PS_SUPPLYCOST DECIMAL,
PS_COMMENT VARCHAR2(199)
);
CREATE TABLE CUSTOMER (
C_CUSTKEY INT NOT NULL,
C_NAME VARCHAR2(25),
C_ADDRESS VARCHAR2(40),
C_NATIONKEY INTEGER NOT NULL, -- references N_NATIONKEY
C_PHONE CHAR(15),
C_ACCTBAL DECIMAL,
C_MKTSEGMENT CHAR(10),
C_COMMENT VARCHAR2(117)
);
CREATE TABLE ORDERS (
O_ORDERKEY INT NOT NULL,
O_CUSTKEY INTEGER NOT NULL, -- references C_CUSTKEY
O_ORDERSTATUS CHAR(1),
O_TOTALPRICE DECIMAL,
O_ORDERDATE DATE,
O_ORDERPRIORITY CHAR(15),
O_CLERK CHAR(15),
O_SHIPPRIORITY INTEGER,
O_COMMENT VARCHAR2(79)
);
CREATE TABLE LINEITEM (
L_ORDERKEY INTEGER NOT NULL, -- references O_ORDERKEY
L_PARTKEY INTEGER NOT NULL, -- references P_PARTKEY (compound fk to PARTSUPP)
L_SUPPKEY INTEGER NOT NULL, -- references S_SUPPKEY (compound fk to PARTSUPP)
L_LINENUMBER INTEGER NOT NULL,
L_QUANTITY DECIMAL,
L_EXTENDEDPRICE DECIMAL,
L_DISCOUNT DECIMAL,
L_TAX DECIMAL,
L_RETURNFLAG CHAR(3),
L_LINESTATUS CHAR(3),
L_SHIPDATE DATE,
L_COMMITDATE DATE,
L_RECEIPTDATE DATE,
L_SHIPINSTRUCT CHAR(25),
L_SHIPMODE CHAR(10),
L_COMMENT VARCHAR2(44)
);
CREATE TABLE REGION (
R_REGIONKEY INT NOT NULL,
R_NAME CHAR(25),
R_COMMENT VARCHAR2(152)
);
2、Oracle导入数据语句
使用sqlldr执行ctl文件进行数据导入,一个LOAD DATA语句一个ctl文件。LOAD DATA语句可参考一下sql。
LOAD DATA INFILE '/data/temp/part.tbl' INTO TABLE part TRAILING NULLCOLS(
P_PARTKEY terminated by '|',
P_NAME terminated by '|',
P_MFGR terminated by '|',
P_BRAND terminated by '|',
P_TYPE terminated by '|',
P_SIZE terminated by '|',
P_CONTAINER terminated by '|',
P_RETAILPRICE terminated by '|',
P_COMMENT terminated by '|'
)
LOAD DATA INFILE '/data/temp/nation.tbl' INTO TABLE nation TRAILING NULLCOLS(
N_NATIONKEY terminated by '|',
N_NAME terminated by '|',
N_REGIONKEY terminated by '|',
N_COMMENT terminated by '|'
)
LOAD DATA INFILE '/data/temp/supplier .tbl' INTO TABLE supplier TRAILING NULLCOLS (
S_SUPPKEY terminated by '|',
S_NAME terminated by '|',
S_ADDRESS terminated by '|',
S_NATIONKEY terminated by '|',
S_PHONE terminated by '|',
S_ACCTBAL terminated by '|',
S_COMMENT terminated by '|'
)
LOAD DATA INFILE '/data/temp/partsupp.tbl' INTO TABLE partsupp TRAILING NULLCOLS(
PS_PARTKEY terminated by '|',
PS_SUPPKEY terminated by '|',
PS_AVAILQTY terminated by '|',
PS_SUPPLYCOST terminated by '|',
PS_COMMENT terminated by '|'
)
LOAD DATA INFILE '/data/temp/customer.tbl' INTO TABLE customer TRAILING NULLCOLS (
C_CUSTKEY terminated by '|',
C_NAME terminated by '|',
C_ADDRESS terminated by '|',
C_NATIONKEY terminated by '|',
C_PHONE terminated by '|',
C_ACCTBAL terminated by '|',
C_MKTSEGMENT terminated by '|',
C_COMMENT terminated by '|'
)
LOAD DATA INFILE '/data/temp/orders.tbl' INTO TABLE orders fields terminated by "|" TRAILING NULLCOLS (
O_ORDERKEY terminated by '|',
O_CUSTKEY terminated by '|',
O_ORDERSTATUS terminated by '|',
O_TOTALPRICE terminated by '|',
O_ORDERDATE DATE "YYYY-MM-DD",
O_ORDERPRIORITY terminated by '|',
O_CLERK terminated by '|',
O_SHIPPRIORITY terminated by '|',
O_COMMENT terminated by '|'
)
LOAD DATA INFILE '/data/temp/lineitem.tbl' INTO TABLE lineitem fields terminated by "|" TRAILING NULLCOLS(
L_ORDERKEY terminated by "|" ,
L_PARTKEY terminated by "|",
L_SUPPKEY terminated by "|",
L_LINENUMBER terminated by "|",
L_QUANTITY terminated by "|",
L_EXTENDEDPRICE terminated by "|",
L_DISCOUNT terminated by "|",
L_TAX terminated by "|",
L_RETURNFLAG CHAR(3) ,
L_LINESTATUS CHAR(3) ,
L_SHIPDATE DATE "YYYY-MM-DD" ,
L_COMMITDATE DATE "YYYY-MM-DD" ,
L_RECEIPTDATE DATE "YYYY-MM-DD" ,
L_SHIPINSTRUCT CHAR(25) ,
L_SHIPMODE CHAR(10) ,
L_COMMENT CHAR(44)
)
LOAD DATA INFILE '/data/temp/region.tbl' INTO TABLE region (
R_REGIONKEY terminated by '|',
R_NAME terminated by '|',
R_COMMENT terminated by '|'
)
执行sqlldr将数据导入到数据库中,执行sqlldr userid=user/password@database control=ctl文件的绝对路径 log=/data/temp/load_tpch.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_part.ctl rows=10000 bindsize=20971520 direct=true log=/data/temp/part.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_customer.ctl rows=10000 bindsize=20971520 direct=true log=/data/temp/customer.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_lineitem.ctl rows=10000 bindsize=20971520 direct=true log=/data/temp/lineitem.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_nation.ctl rows=10000 bindsize=20971520 direct=true log=/data/temp/nation.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_orders.ctl rows=10000 bindsize=20971520 direct=true log=/data/temp/orders.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_partsupp.ctl rows=10000 bindsize=20971520 direct=true log=/data/temp/partsupp.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_region.ctl rows=10000 bindsize=20971520 direct=true log=/data/temp/region.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_supplier.ctl rows=10000 bindsize=20971520 direct=true log=/data/temp/supplier.log
3、Oracle创建主外键语句
-- PRIMARY KEY
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 ORDERS ADD PRIMARY KEY (O_ORDERKEY);
ALTER TABLE LINEITEM ADD PRIMARY KEY (L_ORDERKEY, L_LINENUMBER);
ALTER TABLE NATION ADD PRIMARY KEY (N_NATIONKEY);
ALTER TABLE REGION ADD PRIMARY KEY (R_REGIONKEY);
-- FOREIGN KEY
ALTER TABLE SUPPLIER ADD CONSTRAINT fk_tpcc_1 FOREIGN KEY (S_NATIONKEY) REFERENCES NATION(N_NATIONKEY);
ALTER TABLE PARTSUPP ADD CONSTRAINT fk_tpcc_2 FOREIGN KEY (PS_PARTKEY) REFERENCES PART(P_PARTKEY);
ALTER TABLE PARTSUPP ADD CONSTRAINT fk_tpcc_3 FOREIGN KEY (PS_SUPPKEY) REFERENCES SUPPLIER(S_SUPPKEY);
ALTER TABLE CUSTOMER ADD CONSTRAINT fk_tpcc_4 FOREIGN KEY (C_NATIONKEY) REFERENCES NATION(N_NATIONKEY);
ALTER TABLE ORDERS ADD CONSTRAINT fk_tpcc_5 FOREIGN KEY (O_CUSTKEY) REFERENCES CUSTOMER(C_CUSTKEY);
ALTER TABLE LINEITEM ADD CONSTRAINT fk_tpcc_6 FOREIGN KEY (L_ORDERKEY) REFERENCES ORDERS(O_ORDERKEY);
ALTER TABLE LINEITEM ADD CONSTRAINT fk_tpcc_7 FOREIGN KEY (L_PARTKEY,L_SUPPKEY) REFERENCES PARTSUPP(PS_PARTKEY,PS_SUPPKEY);
ALTER TABLE NATION ADD CONSTRAINT fk_tpcc_8 FOREIGN KEY (N_REGIONKEY) REFERENCES REGION(R_REGIONKEY);
三、MySQL导入数据与脚本处理
1、MySQL建表脚本
create table part (
p_partkey integer not null,
p_name varchar(55) ,
p_mfgr char(25) ,
p_brand char(10) ,
p_type varchar(25) ,
p_size integer ,
p_container char(10) ,
p_retailprice decimal(15,2) ,
p_comment varchar(23) );
create table nation (
n_nationkey integer not null,
n_name char(25) ,
n_regionkey integer not null,
n_comment varchar(152));
create table region (
r_regionkey integer not null,
r_name char(25) ,
r_comment varchar(152));
create table supplier (
s_suppkey integer not null,
s_name char(25) ,
s_address varchar(40) ,
s_nationkey integer not null,
s_phone char(15) ,
s_acctbal decimal(15,2) ,
s_comment varchar(101) );
create table partsupp (
ps_partkey integer not null,
ps_suppkey integer not null,
ps_availqty integer ,
ps_supplycost decimal(15,2) ,
ps_comment varchar(199) );
create table customer (
c_custkey integer not null,
c_name varchar(25) ,
c_address varchar(40) ,
c_nationkey integer not null,
c_phone char(15) ,
c_acctbal decimal(15,2) ,
c_mktsegment char(10) ,
c_comment varchar(117) );
create table orders (
o_orderkey integer not null,
o_custkey integer not null,
o_orderstatus char(1) ,
o_totalprice decimal(15,2) ,
o_orderdate date ,
o_orderpriority char(15) ,
o_clerk char(15) ,
o_shippriority integer ,
o_comment varchar(79) );
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) ,
l_extendedprice decimal(15,2) ,
l_discount decimal(15,2) ,
l_tax decimal(15,2) ,
l_returnflag char(1) ,
l_linestatus char(1) ,
l_shipdate date ,
l_commitdate date ,
l_receiptdate date ,
l_shipinstruct char(25) ,
l_shipmode char(10) ,
l_comment varchar(44) );
2、MySQL导入数据语句
load data local infile '/data/tpch/tpch/data/10g/customer.tbl' into table customer fields terminated by '|';
load data local infile '/data/tpch/tpch/data/10g/lineitem.tbl' into table lineitem fields terminated by '|';
load data local infile '/data/tpch/tpch/data/10g/nation.tbl' into table nation fields terminated by '|';
load data local infile '/data/tpch/tpch/data/10g/orders.tbl' into table orders fields terminated by '|';
load data local infile '/data/tpch/tpch/data/10g/partsupp.tbl' into table partsupp fields terminated by '|';
load data local infile '/data/tpch/tpch/data/10g/part.tbl' into table part fields terminated by '|';
load data local infile '/data/tpch/tpch/data/10g/region.tbl' into table region fields terminated by '|';
load data local infile '/data/tpch/tpch/data/10g/supplier.tbl' into table supplier fields terminated by '|';
3、MySQL创建主外键语句
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 orders add primary key (o_orderkey);
alter table lineitem add primary key (l_orderkey, l_linenumber);
alter table nation add primary key (n_nationkey);
alter table region add primary key (r_regionkey);
alter table supplier add constraint fk_tpcc_1 foreign key(s_nationkey) references nation(n_nationkey);
alter table partsupp add constraint fk_tpcc_2 foreign key(ps_partkey) references part(p_partkey);
alter table partsupp add constraint fk_tpcc_3 foreign key(ps_suppkey) references supplier(s_suppkey);
alter table customer add constraint fk_tpcc_4 foreign key(c_nationkey) references nation(n_nationkey);
alter table orders add constraint fk_tpcc_5 foreign key(o_custkey) references customer(c_custkey);
alter table lineitem add constraint fk_tpcc_6 foreign key(l_orderkey) references orders(o_orderkey);
alter table lineitem add constraint fk_tpcc_7 foreign key(l_partkey,l_suppkey) references partsupp(ps_partkey,ps_suppkey);
alter table nation add constraint fk_tpcc_8 foreign key(n_regionkey) references region(r_regionkey);
四、PostgreSQL导入数据与脚本处理
1、PostgreSQL建表脚本
CREATE TABLE PART (
P_PARTKEY SERIAL NOT NULL,
P_NAME VARCHAR(55),
P_MFGR CHAR(25),
P_BRAND CHAR(10),
P_TYPE VARCHAR(25),
P_SIZE INTEGER,
P_CONTAINER CHAR(10),
P_RETAILPRICE DECIMAL,
P_COMMENT VARCHAR(23)
);
CREATE TABLE NATION (
N_NATIONKEY SERIAL NOT NULL,
N_NAME CHAR(25),
N_REGIONKEY INTEGER NOT NULL, -- references R_REGIONKEY
N_COMMENT VARCHAR(152)
);
CREATE TABLE SUPPLIER (
S_SUPPKEY SERIAL NOT NULL,
S_NAME CHAR(25),
S_ADDRESS VARCHAR(40),
S_NATIONKEY INTEGER NOT NULL, -- references N_NATIONKEY
S_PHONE CHAR(15),
S_ACCTBAL DECIMAL,
S_COMMENT VARCHAR(101)
);
CREATE TABLE PARTSUPP (
PS_PARTKEY INTEGER NOT NULL, -- references P_PARTKEY
PS_SUPPKEY INTEGER NOT NULL, -- references S_SUPPKEY
PS_AVAILQTY INTEGER,
PS_SUPPLYCOST DECIMAL,
PS_COMMENT VARCHAR(199)
);
CREATE TABLE CUSTOMER (
C_CUSTKEY SERIAL NOT NULL,
C_NAME VARCHAR(25),
C_ADDRESS VARCHAR(40),
C_NATIONKEY INTEGER NOT NULL, -- references N_NATIONKEY
C_PHONE CHAR(15),
C_ACCTBAL DECIMAL,
C_MKTSEGMENT CHAR(10),
C_COMMENT VARCHAR(117)
);
CREATE TABLE ORDERS (
O_ORDERKEY SERIAL NOT NULL,
O_CUSTKEY INTEGER NOT NULL, -- references C_CUSTKEY
O_ORDERSTATUS CHAR(1),
O_TOTALPRICE DECIMAL,
O_ORDERDATE DATE,
O_ORDERPRIORITY CHAR(15),
O_CLERK CHAR(15),
O_SHIPPRIORITY INTEGER,
O_COMMENT VARCHAR(79)
);
CREATE TABLE LINEITEM (
L_ORDERKEY INTEGER NOT NULL, -- references O_ORDERKEY
L_PARTKEY INTEGER NOT NULL, -- references P_PARTKEY (compound fk to PARTSUPP)
L_SUPPKEY INTEGER NOT NULL, -- references S_SUPPKEY (compound fk to PARTSUPP)
L_LINENUMBER INTEGER NOT NULL,
L_QUANTITY DECIMAL,
L_EXTENDEDPRICE DECIMAL,
L_DISCOUNT DECIMAL,
L_TAX DECIMAL,
L_RETURNFLAG CHAR(1),
L_LINESTATUS CHAR(1),
L_SHIPDATE DATE,
L_COMMITDATE DATE,
L_RECEIPTDATE DATE,
L_SHIPINSTRUCT CHAR(25),
L_SHIPMODE CHAR(10),
L_COMMENT VARCHAR(44)
);
CREATE TABLE REGION (
R_REGIONKEY SERIAL NOT NULL,
R_NAME CHAR(25),
R_COMMENT VARCHAR(152)
);
2、PostgreSQL导入数据语句
PostgreSQL导入数据前需要先将dbgen生成的数据中每一行最后一个“|”分隔符去除,否则无法正常导入,批量“|”去除的方式可以参考以下脚本。
--将tbl文件转换为csv,在liunx下,进入tbl所在文件夹执行以下命令即可
for i in `ls *.tbl`; do sed 's/|$//' $i > ${i/tbl/csv}; done
数据导入使用COPY命令
COPY customer(C_CUSTKEY,C_NAME,C_ADDRESS,C_NATIONKEY,C_PHONE,C_ACCTBAL,C_MKTSEGMENT,C_COMMENT) FROM '/data/tpch/tpch/data/10g/customer.csv' delimiter '|' ;
COPY lineitem(L_ORDERKEY,L_PARTKEY,L_SUPPKEY,L_LINENUMBER,L_QUANTITY,L_EXTENDEDPRICE,L_DISCOUNT,L_TAX,L_RETURNFLAG,L_LINESTATUS,L_SHIPDATE,L_COMMITDATE,L_RECEIPTDATE,L_SHIPINSTRUCT,L_SHIPMODE,L_COMMENT) FROM '/data/tpch/tpch/data/10g/lineitem.csv' delimiter '|' ;
COPY nation(N_NATIONKEY,N_NAME,N_REGIONKEY,N_COMMENT) FROM '/data/tpch/tpch/data/10g/nation.csv' delimiter '|' ;
COPY orders(O_ORDERKEY,O_CUSTKEY,O_ORDERSTATUS,O_TOTALPRICE,O_ORDERDATE,O_ORDERPRIORITY,O_CLERK,O_SHIPPRIORITY,O_COMMENT) FROM '/data/tpch/tpch/data/10g/orders.csv' delimiter '|' ;
COPY partsupp(PS_PARTKEY,PS_SUPPKEY,PS_AVAILQTY,PS_SUPPLYCOST,PS_COMMENT) FROM '/data/tpch/tpch/data/10g/partsupp.csv' delimiter '|' ;
COPY part(P_PARTKEY,P_NAME,P_MFGR,P_BRAND,P_TYPE,P_SIZE,P_CONTAINER,P_RETAILPRICE,P_COMMENT) FROM '/data/tpch/tpch/data/10g/part.csv' delimiter '|' ;
COPY region(R_REGIONKEY,R_NAME,R_COMMENT) FROM '/data/tpch/tpch/data/10g/region.csv' delimiter '|' ;
COPY supplier(S_SUPPKEY,S_NAME,S_ADDRESS,S_NATIONKEY,S_PHONE,S_ACCTBAL,S_COMMENT) FROM '/data/tpch/tpch/data/10g/supplier.csv' delimiter '|' ;
3、PostgreSQL创建主外键语句
--PRIMARY KEY
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 ORDERS ADD PRIMARY KEY (O_ORDERKEY);
ALTER TABLE LINEITEM ADD PRIMARY KEY (L_ORDERKEY, L_LINENUMBER);
ALTER TABLE NATION ADD PRIMARY KEY (N_NATIONKEY);
ALTER TABLE REGION ADD PRIMARY KEY (R_REGIONKEY);
-- FOREIGN KEY
ALTER TABLE SUPPLIER ADD FOREIGN KEY (S_NATIONKEY) REFERENCES NATION(N_NATIONKEY);
ALTER TABLE PARTSUPP ADD FOREIGN KEY (PS_PARTKEY) REFERENCES PART(P_PARTKEY);
ALTER TABLE PARTSUPP ADD FOREIGN KEY (PS_SUPPKEY) REFERENCES SUPPLIER(S_SUPPKEY);
ALTER TABLE CUSTOMER ADD FOREIGN KEY (C_NATIONKEY) REFERENCES NATION(N_NATIONKEY);
ALTER TABLE ORDERS ADD FOREIGN KEY (O_CUSTKEY) REFERENCES CUSTOMER(C_CUSTKEY);
ALTER TABLE LINEITEM ADD FOREIGN KEY (L_ORDERKEY) REFERENCES ORDERS(O_ORDERKEY);
ALTER TABLE LINEITEM ADD FOREIGN KEY (L_PARTKEY,L_SUPPKEY) REFERENCES PARTSUPP(PS_PARTKEY,PS_SUPPKEY);
ALTER TABLE NATION ADD FOREIGN KEY (N_REGIONKEY) REFERENCES REGION(R_REGIONKEY);