Oracle 23ai TPC-H 测试环境部署
最近,我在 Oracle Database 23ai 上进行了 TPC-H 100GB 测试,并整理了完整的实施步骤和优化经验。如果你也想评估 Oracle 数据库在决策支持场景下的性能,可以参考我的步骤快速上手。
1. 环境准备
在开始测试之前,先介绍下本次测试环境基本情况:
- 数据库版本:Oracle Database 23ai
- 存储:500GB 可用硬盘空间(存放临时文件、数据和索引表空间等)
- 内存:32GB
- CPU:4核处理器(优化并行查询)
- 操作系统:Oracle Linux 8.10(或 RHEL 兼容版本)
首先要确定在此环境成功安装了23ai数据库,安装数据库的具体步骤如果不清楚可参考《在OCI上快速静默安装23ai数据库》。
需要注意23ai只支持多租户架构,所以我这里测试是在ALFRED的租户下,在这个租户中新建一个tpch测试用户,用户的默认表空间指定为TBS_ALFRED,另外,再建立一个专门存放索引的表空间TBS_ALFRED_INDEX用于后续优化。
alter session set container=ALFRED;
--TABLESPACE:tbs_alfred,120G
create tablespace tbs_alfred datafile '/u01/app/oracle/oradata/DEMO/alfred/tbs_alfred01.dbf' size 30G;
--增加数据文件时报错,发现23ai默认创建的就是大文件表空间,那就直接resize 150G(避坑,这里大方点儿,之前我给了120G发现都不够..)
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/DEMO/alfred/tbs_alfred01.dbf' RESIZE 150G;
--TABLESPACE:tbs_alfred_index,60G,直接size指定
create tablespace tbs_alfred_index datafile '/u01/app/oracle/oradata/DEMO/alfred/tbs_alfred_index01.dbf' size 60G;
--创建测试用户tpch,并指定默认表空间为tbs_alfred,赋基本权限
create user tpch identified by tpch default tablespace tbs_alfred;
grant connect, resource to tpch;
ALTER USER TPCH QUOTA UNLIMITED ON TBS_ALFRED;
ALTER USER TPCH QUOTA UNLIMITED ON TBS_ALFRED_INDEX;
这里创建数据文件时,同时监控看到,目前这套测试环境的IO能力并不强,极限也就是每秒200多M的写入。
为了方便后续测试,顺手配置sqlplus能够直接连接到PDB:
# 配置PDB连接,更新tnsnames.ora后测试连接OK
vi /u01/app/oracle/product/23.0.0/db_1/network/admin/tnsnames.ora
sqlplus tpch/tpch@alfred
2. 下载并安装 TPC-H 工具
TPC 组织官方提供 TPC-H Tools,包括:
DBGEN:生成测试数据(8 张表的.tbl数据文件)QGEN:生成 SQL 查询(TPC-H 22 条查询语句)
(1) 下载 TPC-H 工具
从 TPC 官网 tpc.org 下载 TPC-H 工具包:
- 访问 TPC-H 下载页面
- 选择 TPC-H Tools,下载
TPC-H_Tools_v3.0.1.zip
- tpc-h-3.0.1.png
这里需要免费注册下,系统会发给你留的邮箱发送一个下载链接,注意这个链接只能下载一次,且有时间限制: - download-link.png
- 下载成功后解压:(这里用oracle用户解压,方便测试,对于压测类工具个人习惯是放在介质目录/u01/media下)
unzip TPC-H_Tools_v3.0.1.zip
cd TPC-H V3.0.1
(2) 编译 DBGEN 和 QGEN
TPC-H 需要手动配置 makefile.suite,以指定 数据库类型 和 系统环境。
修改 Makefile
编辑 dbgen 目录下的 makefile.suite,实测只需搜索并修改以下行内容即可:
CC=gcc
DATABASE=ORACLE
MACHINE=LINUX
WORKLOAD=TPCH
编译
执行make命令进行编译:
make -f makefile.suite
成功后,当前目录下会生成:
dbgen(用于生成数据)qgen(用于生成查询 SQL)
3. 生成 100GB TPC-H 数据
TPC-H 允许不同规模的数据集,我这里选择 100GB(Scale Factor = 100):
# vi dbgen100.sh
time ./dbgen -s 100 -vf
100G也不小了,所以我这里担心时间过长,因此记录下时间,并把它放到后台执行防止期间中断:
nohup sh dbgen100.sh &
生成的数据文件包括,可使用命令 ls -lrth *.tbl 查看,直观的了解下各个表大小:
[oracle@dbtest dbgen]$ ls -lrth *.tbl
-rw-r--r--. 1 oracle oinstall 137M Mar 6 09:31 supplier.tbl
-rw-r--r--. 1 oracle oinstall 389 Mar 6 09:31 region.tbl
-rw-r--r--. 1 oracle oinstall 2.3G Mar 6 09:31 part.tbl
-rw-r--r--. 1 oracle oinstall 12G Mar 6 09:31 partsupp.tbl
-rw-r--r--. 1 oracle oinstall 17G Mar 6 09:31 orders.tbl
-rw-r--r--. 1 oracle oinstall 2.2K Mar 6 09:31 nation.tbl
-rw-r--r--. 1 oracle oinstall 75G Mar 6 09:31 lineitem.tbl
-rw-r--r--. 1 oracle oinstall 2.3G Mar 6 09:31 customer.tbl
后续优化建议:
- 可以考虑拆分文件,dbgen支持拆分文件,这样同时可方便并行导入,本次100G的测试体量还OK,暂时就先这样。
4. 在 Oracle 数据库 23ai 中创建 TPC-H 表
TPC-H 提供了 dss.ddl,可以直接创建 8 张表。
这样基础测试基本不用改dss.ddl内容,默认表创建就会在TBS_ALFRED表空间中。
第一轮测试不做优化调整类工作。
另外特别提下,脚本中的字段类型定义,比如INTEGER、VARCHAR这些,并不需要手工改为NUMBER和VARCHAR2类型,Oracle自己就会做这个工作,直接执行创建即可,执行完可以desc检查下表结构。
后续优化建议:
- 评估使用 分区表 是否可以提高查询性能,比如针对最大的几张表:lineitem、orders、partsupp,有没有合适的分区方式。
5. 使用 SQL*Loader 批量加载数据
TPC-H 生成的 .tbl 文件需要导入到 Oracle 数据库。我使用 SQL*Loader 进行高效批量导入。
- 创建sqlldr导入所需要控制文件:
对应测试的8张表,每张表单独一个控制文件,这里我故意将控制文件名字大写,更便于区分:
--1. vi NATION.ctl
LOAD DATA
INFILE 'nation.tbl'
INTO TABLE NATION
TRUNCATE
FIELDS TERMINATED BY '|'
(
N_NATIONKEY INTEGER EXTERNAL,
N_NAME CHAR(25),
N_REGIONKEY INTEGER EXTERNAL,
N_COMMENT CHAR(152)
)
--2. vi REGION.ctl
LOAD DATA
INFILE 'region.tbl'
INTO TABLE REGION
TRUNCATE
FIELDS TERMINATED BY '|'
(
R_REGIONKEY INTEGER EXTERNAL,
R_NAME CHAR(25),
R_COMMENT CHAR(152)
)
--3. vi SUPPLIER.ctl
LOAD DATA
INFILE 'supplier.tbl'
INTO TABLE SUPPLIER
TRUNCATE
FIELDS TERMINATED BY '|'
(
S_SUPPKEY INTEGER EXTERNAL,
S_NAME CHAR(25),
S_ADDRESS CHAR(40),
S_NATIONKEY INTEGER EXTERNAL,
S_PHONE CHAR(15),
S_ACCTBAL DECIMAL EXTERNAL,
S_COMMENT CHAR(101)
)
--4. vi PART.ctl
LOAD DATA
INFILE 'part.tbl'
INTO TABLE PART
TRUNCATE
FIELDS TERMINATED BY '|'
(
P_PARTKEY INTEGER EXTERNAL,
P_NAME CHAR(55),
P_MFGR CHAR(25),
P_BRAND CHAR(10),
P_TYPE CHAR(25),
P_SIZE INTEGER EXTERNAL,
P_CONTAINER CHAR(10),
P_RETAILPRICE DECIMAL EXTERNAL,
P_COMMENT CHAR(23)
)
--5. vi PARTSUPP.ctl
LOAD DATA
INFILE 'partsupp.tbl'
INTO TABLE PARTSUPP
TRUNCATE
FIELDS TERMINATED BY '|'
(
PS_PARTKEY INTEGER EXTERNAL,
PS_SUPPKEY INTEGER EXTERNAL,
PS_AVAILQTY INTEGER EXTERNAL,
PS_SUPPLYCOST DECIMAL EXTERNAL,
PS_COMMENT CHAR(199)
)
--6. vi CUSTOMER.ctl
LOAD DATA
INFILE 'customer.tbl'
INTO TABLE CUSTOMER
TRUNCATE
FIELDS TERMINATED BY '|'
(
C_CUSTKEY INTEGER EXTERNAL,
C_NAME CHAR(25),
C_ADDRESS CHAR(40),
C_NATIONKEY INTEGER EXTERNAL,
C_PHONE CHAR(15),
C_ACCTBAL DECIMAL EXTERNAL,
C_MKTSEGMENT CHAR(10),
C_COMMENT CHAR(117)
)
--7. vi ORDERS.ctl
LOAD DATA
INFILE 'orders.tbl'
INTO TABLE ORDERS
TRUNCATE
FIELDS TERMINATED BY '|'
(
O_ORDERKEY INTEGER EXTERNAL,
O_CUSTKEY INTEGER EXTERNAL,
O_ORDERSTATUS CHAR(1),
O_TOTALPRICE DECIMAL EXTERNAL,
O_ORDERDATE DATE "YYYY-MM-DD",
O_ORDERPRIORITY CHAR(15),
O_CLERK CHAR(15),
O_SHIPPRIORITY INTEGER EXTERNAL,
O_COMMENT CHAR(79)
)
--8. vi LINEITEM.ctl
LOAD DATA
INFILE 'lineitem.tbl'
INTO TABLE LINEITEM
TRUNCATE
FIELDS TERMINATED BY '|'
(
L_ORDERKEY INTEGER EXTERNAL,
L_PARTKEY INTEGER EXTERNAL,
L_SUPPKEY INTEGER EXTERNAL,
L_LINENUMBER INTEGER EXTERNAL,
L_QUANTITY DECIMAL EXTERNAL,
L_EXTENDEDPRICE DECIMAL EXTERNAL,
L_DISCOUNT DECIMAL EXTERNAL,
L_TAX DECIMAL EXTERNAL,
L_RETURNFLAG CHAR(1),
L_LINESTATUS CHAR(1),
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)
)
- 运行 SQL*Loader:
# 1.NATION
sqlldr userid=tpch/tpch@alfred control=NATION.ctl log=NATION.log bad=NATION.bad direct=true
# 2.REGION
sqlldr userid=tpch/tpch@alfred control=REGION.ctl log=REGION.log bad=REGION.bad direct=true
# 3.SUPPLIER
sqlldr userid=tpch/tpch@alfred control=SUPPLIER.ctl log=SUPPLIER.log bad=SUPPLIER.bad direct=true
# 4.PART
sqlldr userid=tpch/tpch@alfred control=PART.ctl log=PART.log bad=PART.bad direct=true
# 5.PARTSUPP
sqlldr userid=tpch/tpch@alfred control=PARTSUPP.ctl log=PARTSUPP.log bad=PARTSUPP.bad direct=true
# 6.CUSTOMER
sqlldr userid=tpch/tpch@alfred control=CUSTOMER.ctl log=CUSTOMER.log bad=CUSTOMER.bad direct=true
# 7.ORDERS
sqlldr userid=tpch/tpch@alfred control=ORDERS.ctl log=ORDERS.log bad=ORDERS.bad direct=true
# 8.LINEITEM
sqlldr userid=tpch/tpch@alfred control=LINEITEM.ctl log=LINEITEM.log bad=LINEITEM.bad direct=true
# OPTION1:我这里因为先前只给了120G表空间,结果空间不够用,所以调整后继续加载。此外需要注意,更改LINEITEM.ctl为append,否则会清空之前记录
sqlldr userid=tpch/tpch@alfred control=LINEITEM.ctl log=LINEITEM.log bad=LINEITEM.bad discard=LINEITEM.dsc direct=true skip=582854696
# OPTION2:因为尚未建立任何主键唯一约束,看测试数据不是整数,误以为是数据多了一些,干脆还是全新导入,重新修改LINEITEM.ctl为truncate模式,重复步骤8,结果发现还是600037902行:
sqlldr userid=tpch/tpch@alfred control=LINEITEM.ctl log=LINEITEM.log bad=LINEITEM.bad direct=true
6. 运行 TPC-H 22 条查询
TPC-H 预定义了 22 条 SQL 查询,可以使用 qgen 生成 SQL 语句:
这里遇到一个问题,简单记录下:
[oracle@dbtest dbgen]$ ./qgen -s 100 1 > query1.sql
Open failed for ./1.sql at qgen.c:170
这个报错浪费了些许时间,最后发现是要设置下变量,然后再次执行就OK:
[oracle@dbtest dbgen]$ export DSS_QUERY=./queries
[oracle@dbtest dbgen]$ ./qgen -s 100 1 > query1.sql
确认OK后,直接使用下面命令,快速生成这22个query:
for i in $(seq 1 22); do
./qgen -s 100 $i > query$i.sql
echo "Generated query$i.sql"
done
然后就可以选择在 Oracle 数据库中运行,并记录执行时间:
SQL>
@query1
@query2
...
@query22
至此,Oracle 23ai TPC-H 测试环境准备已经完成,注意此时还没有任何优化,甚至个别SQL的默认生成语法和Oracle并不兼容,后续文章将记录这些详细调整方法和一些优化技巧,敬请期待!
Oracle 23ai TPC-H 测试环境部署的更多相关文章
- (5.2)mysql高可用系列——测试环境部署
关键词环境部署: ############## 测试环境机器架构 #########[1]策划[1.1]linux服务器A组 8台 192.168.1.200~192.168.1.207,主机名db, ...
- NodeJs 开发微信公众号(二)测试环境部署
由于卤煮本人是做前端开发的,所以在做公众号过程中基本上没有遇到前端问题,在这方面花的时间是最少的.加上用了mui框架(纯css界面)和自己积累的代码,很快地开发出了界面来.接着是后台开发.卤煮选的是n ...
- Hadoop 学习笔记 (八) hadoop2.2.0 测试环境部署 及两种启动方式
1基本流程步骤1:准备硬件(linux操作系统)步骤2:准备软件安装包,并安装基础软件(主要是JDK)步骤3:修改配置文件步骤4:分发hadoop步骤5:启动服务步骤6:验证是否启动成功!2硬件配置要 ...
- 测试环境部署之填坑记录-Expected one result (or null) to be returned by selectOne(), but found: 2
最近在部署性能测试环境的时候,环境 部署好以后,部分功能出现接口查询异常,问题现象: 拿到错误,肯定要先判断是前端还是后端代码的问题,最简单的方式是抓包查看: 以上是报错页面捕获的接口报错,很明显的接 ...
- Greenplum测试环境部署
1.准备3台主机 本实例是部署实验环境,采用的是Citrix的虚拟化环境,分配了3台RHEL6.4的主机. |------|------| |Master|创建模板后,额外添加20G一块磁盘/dev/ ...
- 在testrpc以太坊测试环境部署智能合约
2018年03月13日 09:20:54 思无邪-machengyu 阅读数 2683 版权声明:本文为博主原创文章,转载请务必注明出处,否则追究法律责任 https://blog.csdn.ne ...
- 15. 测试环境部署-linux
抽奖项目部署文档: 1.抽奖项目使用python3开发,python版本3.x都可以 需要安装的python第三方模块 pip install django==1.9.0 这个一定要加版本号 pip ...
- LINUX测试环境部署nginx(五)
安装配置nginx 安装编译环境:yum -y install pcre-devel openssl openssl-devel 拷贝nginx压缩文件到目标目录后,解压tar -zxvf nginx ...
- (转)LINUX测试环境部署Redis(四)
安装配置Redis 第一部分:安装redis 希望将redis安装到此目录 1 /usr/local/redis 希望将安装包下载到此目录 1 /usr/local/src 那么安装过程指令如下: ...
- Airtest iOS测试环境部署
[本文出自天外归云的博客园] 简介 这个Airtest IDE是通过iOS-Tagent来操作iPhone的,你可以在Airtest IDE里录制脚本来实现自动化操作iPhone 前提 1. 得有个i ...
随机推荐
- Swagger注解-@ApiModel 和 @ApiModelProperty
@ApiModel 使用场景 在实体类上边使用,标记类时swagger的解析类 概述 提供有关swagger模型的其它信息,类将在操作中用作类型时自动内省 属性 属性名称 数据类型 默认值 说明 va ...
- H2数据库用户自定义函数方法及范例
H2数据库,是Java实现的内存数据库.可使用它作为嵌入式内存数据库,但就其特性还用更多值得应用在实际项目中的意义.之前的一篇Blog中已经描述过其使用方法及丰富的连接数据库方式. 官方主页:http ...
- Qt/C++音视频开发49-多级连保存和推流设计(同时保存到多个文件/推流到多个平台)
一.前言 近期遇到个用户需要多级联的保存和推流,在ffmpegsave多线程保存类中实现这个功能,越简单越好,就是在推流的同时,能够开启自动转储功能,一边推流的同时一边录像保存到本地视频文件.最初设想 ...
- Qt编写安防视频监控系统43-图片回放
一.前言 之前就已经具备了本地回放.远程回放.设备播放3个模块,其中本地回放用来回放存储在软件本地电脑上的视频文件:远程回放需要通过调用厂家sdk或者GB28181(没实现,后期考虑增加)从NVR回放 ...
- IDEA利用阿里云插件部署Springboot项目
下载插件 搜索 Alibaba Cloud Toolkit 插件,并安装. IDEA增加Run/Debug Configurations Add New Configuration - Deploy ...
- ASP.NET Core 中的速率限制中间件的使用
简介 在ASP.NET Core中,速率限制中间件是用来控制客户端对Web API或MVC应用程序发出请求的速率,以防止服务器过载和提高安全性. 下面是 AddRateLimiter 的一些基本用法: ...
- 开源即时通讯IM框架MobileIMSDK的H5端技术概览
一.基本介绍 MobileIMSDK的H5端是一套纯JS编写的基于标准WebSocket的即时通讯库: 1)超轻量级.极少依赖: 2)纯JS编写.高度提炼,简单易用: 3)基于标准WebSocket协 ...
- Python学习(六)——配套《PyTorch深度学习实战》
1. NumPy介绍 这张图片介绍了Python中两个非常重要的科学计算库:NumPy和SciPy,以及它们的核心功能和特性. NumPy NumPy(Numerical Python)是一个开源的P ...
- 高通QCM6125平台TZ释放后使用GPIO导致死机问题
问题的根本原因是TZ侧没有释放完整. 释放QUPV3_0_SE0从TZ到AP侧,QUPv3的固件也从SPI改成了UART 2线. 但是出现了一个很奇怪的问题,AP侧可以使用UART,但是一旦使用GPI ...
- 深入剖析数据删除操作:DELETE 语句的使用与管理实践
title: 深入剖析数据删除操作:DELETE 语句的使用与管理实践 date: 2025/1/8 updated: 2025/1/8 author: cmdragon excerpt: 数据删除( ...