达梦数据库 TPCC 性能测试全流程指南

一、测试准备

1.1 环境部署前提

已完成达梦数据库的部署工作,确保数据库服务正常运行。

1.2 测试工具获取

从达梦官网下载 TPCC 测试所需的软件包(bms.tar.gz)。

1.3 软件包上传

将下载的软件包通过工具(如 FinalShell)上传至服务器指定目录,此文档路径为/data/test2/dsp

二、测试环境配置

2.1 软件包解压部署

  1. 进入软件包存放目录:
cd /data/test2/dsp
  1. 执行解压命令:
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 标准测试表,核心表结构如下:

  1. 配置表
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 测试数据装载

  1. 进入测试脚本目录:
cd /data/test2/dsp/benchmarksql-5.0/run
  1. 执行数据加载命令:
./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 无索引基准测试

  1. 执行测试命令:
./runBenchmark.sh props.dm

在这里插入图片描述

  1. 测试结果:
  • 新订单吞吐量(tpmC):74,859.19

  • 整体吞吐量(tpmTOTAL):166,311.78

  • 事务总数:1,663,297

  • 测试时长:10 分钟(16:43:33–16:53:33)
    在这里插入图片描述

3.2 有索引优化测试

3.2.1 索引与序列创建

  1. 创建客户表索引:
create index ndx_customer_name on BENCHMARKSQL.BMSQL_customer (c_w_id, c_d_id, c_last, c_first);
  1. 优化历史表主键生成(通过序列自动赋值):
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 场景的优化措施有效。建议在实际生产环境中,针对高频查询字段建立适当索引,并合理使用序列生成主键,以提升业务系统性能。

达梦技术社区

达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐