Linux环境下安装TPC-H与数据导入PostgreSQL

本文详细介绍了如何在Linux环境中安装TPC-H,并将生成的数据导入PostgreSQL数据库。步骤包括下载TPC-H工具包,解压、编辑配置文件,编译生成数据,修改数据文件格式,创建PostgreSQL表结构,最后通过COPY命令将数据导入各个表中,并设置主键和外键约束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总共需要以下10个步骤,不包括QGEN部分(经过赋值的22个SQL语句参考附录)。


1. 下载 TPC-H 官方工具包,地址:http://www.tpc.org/tpc_documents_current_versions/current_specifications.asp

2. 解压工具包,打开DBGEN文件夹

3. 编辑配置文档,修改其中的参数如下

vim makefile.suite 

------------------------------------------------------
CC = gcc 
DATABASE =SQLSERVER 
VECTORWISE =LINUX 
WORKLOAD =TPCH


4. 编译工具

make -f makefile.suite


5. 生成1G大小的数据

./dbgen -s 1


6. 修改数据文件,执行以下脚本去掉数据行结尾的“|”符号,并将更改后的数据文件保存在新建的文件夹handle中

mkdir handle
------------------------------------------------------------

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


7. 打开PostgreSQL控制台

psql -h 127.0.0.1 -d postgres -U postgres


8. 执行下面的SQL,创建8张表结构

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


9. 输入下面的PostgreSQL命令将步骤6中创建的数据导入到表中,注意修改实际的文件路径

copy region from '/opt/tpc/2.17.3/dbgen/handle/region.tbl' with delimiter as '|' NULL '';
copy nation from '/opt/tpc/2.17.3/dbgen/handle/nation.tbl' with

<think>嗯,用户想要在PostgreSQL 15上安装TPC-H,并且创建tpch模式下的表,使用postgres用户和数据库。我需要从头开始整理步骤,确保每个环节都正确。首先,安装PostgreSQL 15,不同操作系统步骤可能不同,用户可能用的是Linux,比如Ubuntu或者CentOS?不过用户没说明,可能需要给出通用的方法,或者主要针对常见的Linux发行版。 接下来,安装TPC-H工具。TPC-H需要从官网下载,但可能需要注册,用户是否有权限?或者有没有其他途径获取?或者是否需要使用GitHub上的生成工具?比如tpch-dbgen,这个可能需要编译。用户可能需要安装编译依赖,比如gcc和make。这部分需要详细说明,比如下载dbgen,解压,修改makefile,编译生成数据生成器。 然后生成测试数据,比如生成8个表的数据,每个文件对应一个表。这时候需要注意数据的格式,可能需要调整分隔符,确保PostgreSQL可以正确导入。默认的分隔符是|,但有时候末尾可能会有问题,可能需要处理一下。 接下来是创建数据库和模式。用户已经指定使用postgres用户和数据库,所以可能需要直接在postgres数据库中创建模式tpch,然后所有表都放在这个模式下。需要确保用户有权限创建模式,并设置search_path或者在创建表时指定模式。 然后是创建表结构,TPC-H有标准的表结构定义,需要根据dbgen中的dss.ddl文件来创建,但可能需要调整,比如指定模式为tpch,以及调整字段类型,比如将DECIMAL改为NUMERIC,VARCHAR保持。同时需要注意索引和外键的问题,可能默认不创建外键,但用户可能需要基础结构,所以暂时先不处理索引和约束,除非用户特别要求。 数据导入部分,使用COPY命令,但需要确保文件路径正确,权限允许postgres用户读取。可能需要将生成的.tbl文件移动到PostgreSQL有权限访问的目录,或者使用绝对路径。另外,COPY命令需要指定分隔符为|,可能需要处理末尾的分隔符,或者使用额外的参数,比如DELIMITER '|' CSV。 最后验证数据,检查行数是否匹配,执行简单的查询测试。可能还需要说明如何清理数据,比如删除模式或表,但用户没有提到,可能不需要。 过程中需要注意权限问题,比如使用postgres用户操作,可能需要切换到postgres用户或者使用sudo。另外,如果用户遇到问题,比如无法编译dbgen,可能需要检查依赖是否安装,或者makefile是否正确修改。还有数据生成的大小,用户可能需要调整缩放因子,默认是1,生成大约1GB的数据,但用户可能需要更大的数据量,但教程中可以保持默认。 总结步骤:安装PostgreSQL 15 -> 安装TPC-H工具 -> 生成数据 -> 创建模式和表 -> 导入数据 -> 验证。需要详细每个步骤的命令和注意事项,比如修改makefile的部分,创建模式,COPY命令的正确使用等。确保用户能一步步执行,避免常见错误,比如权限问题、路径错误、语法错误等。</think>以下是从PostgreSQL 15安装TPC-H部署的完整步骤: --- ### 一、安装PostgreSQL 15 #### 1. 添加官方仓库(Ubuntu/Debian示例) ```bash sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt update ``` #### 2. 安装服务端 ```bash sudo apt install postgresql-15 ``` #### 3. 启动服务 ```bash sudo systemctl start postgresql@15-main ``` --- ### 二、准备TPC-H工具 #### 1. 安装编译依赖 ```bash sudo apt install gcc make unzip git ``` #### 2. 下载TPC-H工具 ```bash git clone https://github.com/electrum/tpch-dbgen.git cd tpch-dbgen ``` #### 3. 修改配置文件 ```makefile # 编辑Makefile CC = gcc DATABASE = POSTGRESQL MACHINE = LINUX WORKLOAD = TPCH ``` #### 4. 编译工具 ```bash make clean make ``` --- ### 三、生成测试数据 #### 1. 生成8个表数据(默认缩放因子SF=1) ```bash ./dbgen -vf -s 1 ``` #### 2. 清理数据格式 ```bash sed -i 's/|$//' *.tbl # 移除行尾多余的|符号 ``` --- ### 四、创建数据库结构 #### 1. 登录PostgreSQL ```bash sudo -u postgres psql ``` #### 2. 创建专属schema ```sql CREATE SCHEMA tpch; SET search_path TO tpch, public; ``` #### 3. 执行建表语句 ```sql -- 在psql中执行以下SQL CREATE TABLE tpch.nation ( n_nationkey INTEGER PRIMARY KEY, n_name CHAR(25), n_regionkey INTEGER, n_comment VARCHAR(152) ); -- 其余7个表结构类似(region, part, supplier, partsupp, customer, orders, lineitem) -- 完整DDL可从dbgen/dss.ddl提取并调整字段类型 ``` --- ### 五、导入数据 #### 1. 复制文件到PostgreSQL可访问目录 ```bash sudo mkdir /var/lib/postgresql/tpch_data sudo chown postgres:postgres /var/lib/postgresql/tpch_data sudo mv *.tbl /var/lib/postgresql/tpch_data/ ``` #### 2. 使用COPY命令导入(以nation表为例) ```sql COPY tpch.nation FROM '/var/lib/postgresql/tpch_data/nation.tbl' WITH DELIMITER '|' CSV; ``` #### 3. 批量导入脚本 ```bash for tbl in region nation customer supplier part partsupp orders lineitem; do psql -U postgres -d postgres -c "COPY tpch.$tbl FROM '/var/lib/postgresql/tpch_data/$tbl.tbl' WITH DELIMITER '|' CSV;" done ``` --- ### 六、验证数据 #### 1. 检查行数 ```sql SELECT 'nation' AS table, count(*) FROM tpch.nation UNION ALL SELECT 'orders', count(*) FROM tpch.orders; -- 其他表类似 ``` #### 2. 执行示例查询 ```sql -- 查看客户订单分布 SELECT c_custkey, COUNT(o_orderkey) FROM tpch.customer JOIN tpch.orders USING (c_custkey) GROUP BY 1 LIMIT 10; ``` --- ### 最终表清单 | 表名 | 描述 | 预估行数(SF=1) | |---------------|----------------------|---------------| | tpch.nation | 国家信息 | 25 | | tpch.region | 地区信息 | 5 | | tpch.part | 零件信息 | 200,000 | | tpch.supplier | 供应商信息 | 10,000 | | tpch.partsupp | 零件供应关系 | 800,000 | | tpch.customer | 客户信息 | 150,000 | | tpch.orders | 订单信息 | 1,500,000 | | tpch.lineitem | 订单明细 | 6,000,000 | --- ### 常见问题处理 1. **权限问题**:确保`/var/lib/postgresql/tpch_data`目录属于postgres用户 2. **数据生成失败**:检查`dbgen`编译是否成功,尝试`make clean && make` 3. **COPY命令报错**:使用`sed -i 's/|$//' *.tbl`清理数据文件尾部 可通过`EXPLAIN ANALYZE`分析查询性能,建议后续添加索引优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值