《达梦数据库 TPCC 性能测试全流程及优化》
指标类型无索引(基准测试)加索引 + 序列优化变化趋势新订单吞吐量(tpmC)74,859.1977,452.29提升~3.4%整体吞吐量(tpmTOTAL)166,311.78172,209.11提升~3.5%事务总数1,663,2971,722,535增加~3.56 万测试时长10 分钟10 分钟一致(控制变量)
达梦数据库 TPCC 性能测试全流程指南
一、测试准备
1.1 环境部署前提
已完成达梦数据库的部署工作,确保数据库服务正常运行。
1.2 测试工具获取
从达梦官网下载 TPCC 测试所需的软件包(bms.tar.gz)。
1.3 软件包上传
将下载的软件包通过工具(如 FinalShell)上传至服务器指定目录,此文档路径为/data/test2/dsp。
二、测试环境配置
2.1 软件包解压部署
- 进入软件包存放目录:
cd /data/test2/dsp
- 执行解压命令:
tar zxvf bms.tar.gz

解压后将生成benchmarksql-5.0xc2-westone-v1.2目录,包含测试所需的 Java 源码、配置文件等核心组件。
2.2 BenchmarkSQL 配置
2.2.1 数据库类型适配
修改benchmarksql-5.0/src/client/jTPCC.java文件,确保达梦数据库类型被正确识别:
else if (iDB.equals("dm"))
dbType = DB_DM;

该配置用于在测试程序中注册达梦数据库驱动类型,保证后续连接和操作的兼容性。
2.2.2 类路径配置
编辑/data/test2/dsp/benchmarksql-5.0/run/funcs.sh文件,在setCP()函数中添加达梦数据库的类路径配置:
dm)
cp="../lib/dm/*:../lib/*"
;;

此配置确保测试程序能正确加载达梦 JDBC 驱动及相关依赖库。
2.2.3 驱动包部署
在benchmarksql-5.0/lib目录下创建dm文件夹,将达梦 JDBC 驱动包DmJdbcDriver18.jar放入该目录,用于数据库连接。
2.2.4 脚本优化
修改benchmarksql-5.0/run/runDatabaseBuild.sh文件,移除AFTER_LOAD参数中的extraHistID,避免达梦数据库不兼容的操作:
AFTER_LOAD="indexCreates foreignKeys buildFinish"

2.2.5 压测参数配置
在benchmarksql-5.0/run目录下创建 / 编辑props.dm文件,
修改IP地址和端口以及用户名和密码,此处修改用户名为后面创表的用户名,
配置核心参数如下:
db=dm
driver=dm.jdbc.driver.DmDriver
conn=jdbc:dm://10.76.11.28:9
user=BENCHMARKSQL
password=A123a123
#数据库连接相关信息
warehouses=100
#压测的仓位数
loadWorkers=48
#加载的工作线程数
terminals=100
#并发的终端数
//To run specified transactions per terminal- runMins must equal zero
runTxnsPerTerminal=0
//To run for specified minutes- runTxnsPerTerminal must equal zero
#运行指定的分钟- runTxnsPerTerminal必须等于0
runMins=10
#执行时间
//Number of total transactions per minute
limitTxnsPerMin=0
//Set to true to run in 4.x compatible mode. Set to false to use the
//entire configured database evenly.
terminalWarehouseFixed=true
//The following five values must add up to 100
//The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4
// Directory name to create for collecting detailed result data.
// Comment this out to suppress.
resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
#结果目录
osCollectorScript=./misc/os_collector_linux.py
osCollectorInterval=1

2.3 数据库对象准备
2.3.1 连接数据库
使用达梦 disql 工具连接数据库:
/data/test2/dsp/dmdbms/bin/disql SYSDBA/A123a123:9
2.3.2 表空间创建
为测试创建独立表空间并扩展数据文件:
CREATE TABLESPACE BENCHMARKSQL1 DATAFILE 'BENCHMARKSQL1.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL2.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL3.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL4.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL5.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL6.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL7.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL8.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL9.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL10.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL11.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL12.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL13.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL14.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL15.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL16.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL17.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL18.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL19.dbf' SIZE 1000;
ALTER TABLESPACE BENCHMARKSQL1 ADD DATAFILE 'BENCHMARKSQL20.dbf' SIZE 1000;
# 依次添加至BENCHMARKSQL20.dbf,共20个数据文件

2.3.3 测试用户创建
创建测试专用用户并授权:
CREATE USER "BENCHMARKSQL" IDENTIFIED BY "A123a123" DEFAULT TABLESPACE "BENCHMARKSQL1";
GRANT DBA TO BENCHMARKSQL; # 授予管理员权限以创建对象和执行测试

2.3.4 系统参数优化
调整 ROLL 表空间和日志文件大小,提升 OLTP 性能:
alter tablespace "ROLL" resize datafile 'ROLL.DBF' to 10000; # 解决回滚段不足
alter database resize logfile 'DAMENG01.log' to 40000; # 减少日志切换频率
alter database resize logfile 'DAMENG02.log' to 40000;

2.3.5 测试表创建
创建 TPCC 标准测试表,核心表结构如下:
- 配置表
create table BENCHMARKSQL.bmsql_config (
cfg_name varchar(30) cluster primary key,
cfg_value varchar(50)
);

create table BENCHMARKSQL.bmsql_warehouse (
w_id integer not null,
w_ytd decimal(22,2),
w_tax float,
w_name varchar(10),
w_street_1 varchar(20),
w_street_2 varchar(20),
w_city varchar(20),
w_state char(2),
w_zip char(9),
cluster primary key(w_id)
)STORAGE(FILLFACTOR 1);

create table BENCHMARKSQL.bmsql_district (
d_w_id integer not null,
d_id integer not null,
d_ytd decimal(22,2),
d_tax float,
d_next_o_id integer,
d_name varchar(10),
d_street_1 varchar(20),
d_street_2 varchar(20),
d_city varchar(20),
d_state char(2),
d_zip char(9),
cluster primary key(d_w_id, d_id)
)STORAGE(FILLFACTOR 1);

create table BENCHMARKSQL.bmsql_customer (
c_w_id integer not null,
c_d_id integer not null,
c_id integer not null,
c_discount float,
c_credit char(2),
c_last varchar(16),
c_first varchar(16),
c_credit_lim float,
c_balance float,
c_ytd_payment float,
c_payment_cnt integer,
c_delivery_cnt integer,
c_street_1 varchar(20),
c_street_2 varchar(20),
c_city varchar(20),
c_state char(2),
c_zip char(9),
c_phone char(16),
c_since timestamp,
c_middle char(2),
c_data varchar(500),
cluster primary key(c_w_id, c_d_id, c_id)
);

create table BENCHMARKSQL.bmsql_history (
hist_id integer,
h_c_id integer,
h_c_d_id integer,
h_c_w_id integer,
h_d_id integer,
h_w_id integer,
h_date timestamp,
h_amount float,
h_data varchar(24)
)storage(branch(32,32),without counter);

create table BENCHMARKSQL.bmsql_oorder (
o_w_id integer not null,
o_d_id integer not null,
o_id integer not null,
o_c_id integer,
o_carrier_id integer,
o_ol_cnt float,
o_all_local float,
o_entry_d timestamp,
cluster primary key(o_w_id, o_d_id, o_id)
)storage(without counter);

create table BENCHMARKSQL.bmsql_new_order (
no_w_id integer not null,
no_d_id integer not null,
no_o_id integer not null,
cluster primary key(no_w_id, no_d_id, no_o_id)
)storage(without counter);

create table BENCHMARKSQL.bmsql_order_line (
ol_w_id integer not null,
ol_d_id integer not null,
ol_o_id integer not null,
ol_number integer not null,
ol_i_id integer not null,
ol_delivery_d timestamp,
ol_amount float,
ol_supply_w_id integer,
ol_quantity float,
ol_dist_info char(24),
cluster primary key(ol_w_id, ol_d_id, ol_o_id, ol_number)
)storage(without counter);

create table BENCHMARKSQL.bmsql_stock (
s_w_id integer not null,
s_i_id integer not null,
s_quantity float,
s_ytd float,
s_order_cnt integer,
s_remote_cnt integer,
s_data varchar(50),
s_dist_01 char(24),
s_dist_02 char(24),
s_dist_03 char(24),
s_dist_04 char(24),
s_dist_05 char(24),
s_dist_06 char(24),
s_dist_07 char(24),
s_dist_08 char(24),
s_dist_09 char(24),
s_dist_10 char(24),
cluster primary key(s_w_id, s_i_id)
);

create table BENCHMARKSQL.bmsql_item (
i_id integer not null,
i_name varchar(24),
i_price float,
i_data varchar(50),
i_im_id integer,
cluster primary key(i_id)
);

2.4 测试数据装载
- 进入测试脚本目录:
cd /data/test2/dsp/benchmarksql-5.0/run
- 执行数据加载命令:
./runLoader.sh props.dm numWarehouses 100

提示:100 个仓库的数据量较大,加载过程可能需要数十分钟,请耐心等待。
2.5 统计信息收集
执行以下 SQL 核对数据量并预加载数据到内存:
select count(*) from "BENCHMARKSQL"."BMSQL_CUSTOMER" union all
select count(*) from "BENCHMARKSQL"."BMSQL_DISTRICT" union all
select count(*) from "BENCHMARKSQL"."BMSQL_ITEM" union all
select count(*) from "BENCHMARKSQL"."BMSQL_NEW_ORDER" union all
select count(*) from "BENCHMARKSQL"."BMSQL_OORDER" union all
select count(*) from "BENCHMARKSQL"."BMSQL_ORDER_LINE" union all
select count(*) from "BENCHMARKSQL"."BMSQL_STOCK" union all
select count(*) from "BENCHMARKSQL"."BMSQL_WAREHOUSE" union all
select count(*) from "BENCHMARKSQL"."BMSQL_HISTORY" union all
select count("C_PAYMENT_CNT") from "BENCHMARKSQL"."BMSQL_CUSTOMER";

正常情况下,100 仓库的数据集应包含约 300 万客户记录、10 万商品记录等(具体数值参考执行结果)。
三、性能测试执行
3.1 无索引基准测试
- 执行测试命令:
./runBenchmark.sh props.dm

- 测试结果:
-
新订单吞吐量(tpmC):74,859.19
-
整体吞吐量(tpmTOTAL):166,311.78
-
事务总数:1,663,297
-
测试时长:10 分钟(16:43:33–16:53:33)

3.2 有索引优化测试
3.2.1 索引与序列创建
- 创建客户表索引:
create index ndx_customer_name on BENCHMARKSQL.BMSQL_customer (c_w_id, c_d_id, c_last, c_first);
- 优化历史表主键生成(通过序列自动赋值):
create or replace procedure BENCHMARKSQL.createsequence
as
n int;
stmt1 varchar(200);
begin
select count(*)+1 into n from BMSQL_history;
if(n != 1) then
select max(hist_id) + 1 into n from BMSQL_history;
end if;
PRINT n;
stmt1:='create sequence hist_id_seq start with '||n||' MAXVALUE 9223372036854775807 CACHE 50000;';
EXECUTE IMMEDIATE stmt1;
end;
/
call BENCHMARKSQL.createsequence;
alter table BENCHMARKSQL.BMSQL_history modify hist_id integer default (BENCHMARKSQL.hist_id_seq.nextval);

3.2.2 优化后测试结果
-
新订单吞吐量(tpmC):77,452.29(提升约 3.4%)
-
整体吞吐量(tpmTOTAL):172,209.11(提升约 3.5%)
-
事务总数:1,722,535(增加约 3.56 万)
-
测试时长:10 分钟(17:01:59–17:11:59)

3.3 测试数据清理
执行以下命令清除测试数据(如需重复测试):
./runDatabaseDestroy.sh props.dm
四、测试结果分析
4.1 性能对比总结
| 指标类型 | 无索引(基准测试) | 加索引 + 序列优化 | 变化趋势 |
|---|---|---|---|
| 新订单吞吐量(tpmC) | 74,859.19 | 77,452.29 | 提升~3.4% |
| 整体吞吐量(tpmTOTAL) | 166,311.78 | 172,209.11 | 提升~3.5% |
| 事务总数 | 1,663,297 | 1,722,535 | 增加~3.56 万 |
| 测试时长 | 10 分钟 | 10 分钟 | 一致(控制变量) |
4.2 优化项作用解析
4.2.1 索引ndx_customer_name的价值
-
设计逻辑:覆盖仓库 ID、区域 ID、客户姓名,精准匹配新订单事务中按客户信息检索的场景。
-
性能影响:减少客户表全表扫描,加速新订单事务执行,直接提升 tpmC 指标。
4.2.2 序列与存储过程的作用
-
设计逻辑:通过存储过程动态生成序列起始值,避免主键冲突;历史表主键默认关联序列,实现高效自动赋值。
-
性能影响:解决主键生成的锁竞争问题,提升历史表插入效率,增加整体事务处理能力。
五、结论
本次测试验证了达梦数据库在 TPCC 场景下的性能表现。通过索引优化和序列优化,系统吞吐量提升约 3.5%,说明达梦数据库对 OLTP 场景的优化措施有效。建议在实际生产环境中,针对高频查询字段建立适当索引,并合理使用序列生成主键,以提升业务系统性能。
达梦技术社区
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)