PostgreSQL码农集散地

爽! 用 pgbench 跑 tpcc benchmark

本期播客

爽! 用 pgbench 跑 tpcc benchmark

压测tpcc的软件很多, 但是都需要额外的软件, 都需要外部生成数据, 都需要将数据再导入数据库.

PostgreSQL本身就提供了pgbench压测工具, 并且内置的语义也非常强大, 为什么不能直接用pgbench进行tpcc压测呢?

安排, https://github.com/kmoppel/pgbench-tpcc-like 这款开源软件就是来解决这个问题的, 实际上就是一些sql文本, 利用了pgbench强大的语义.

TPC-C 是关于什么的?

简而言之,TPC-C 模拟一家零售公司,其仓库数量可配置,每个仓库包含 10 个区域,每个区域有 3000 个客户,并拥有一个已处理订单和新订单池。仓库中存有一定数量的库存,客户下单时会包含多个商品,但每个商品数量固定为 10 万件。交易包括添加新订单、跟踪付款、发货、检查库存等。

根据官方 TPC-C 规范,大致的业务请求组合以及占比如下:

  • 新建订单:~45%
  • 付款:~43%
  • 订单状态查询:~4%
  • 发货:~4%
  • 库存水平查询:~4%

最终报告的性能指标是每分钟处理的订单数,即每分钟事务数 ( tpmC new order )。我们使用多个并行事务来模拟业务活动,每个事务都受到响应时间限制以及其他一些复杂的“键控”延迟以及数据选择/值设置规则的影响。

使用 pgbench-tpcc-like

pgbench-tpcc-like 的设计理念

  • 大多数时候,我并不真正关心学术上的正确性,而是想快速让数据库以一种“足够接近现实生活”的方式“出汗”(即压测)。
  • 我不想安装任何额外的工具/库
  • 我希望能够随时调整数据集大小和生成并行度
  • 数据初始化阶段应该很快,并且数据生成应该在数据库服务器上进行,以避免通过网络传输数百 GB 的数据( 因为 LibPQ 尚未支持协议层压缩 )
  • 我希望能够轻松更改读写权重(weight),或者添加一些自定义查询/事务以更好地考虑客户的实际工作量。

因此 pgbench-tpcc-like 实际上提供了一些SQL文件, 支持初始化数据, 支持根据weight权重设置调用比例.

使用方法示例

git clone --depth 1 https://github.com/kmoppel/pgbench-tpcc-like.git && cd pgbench-tpcc-like  

createdb tpcc  

psql -f 00_schema.sql tpcc   

# Generate ~40GB of starting data, using 4*100=400 "warehouses"  
# 1 warehouse ~ 100MiB of disk space  
pgbench -n -f 01_init_data.pgbench -c 4 -t 100 tpcc   

# Test for 30min(1800s) with 8 clients / parallel sessions   
# 每10秒输出一次统计信息  
pgbench -n -c 8 -j 8 -T 1800 -P 10 -f new_order.pgbench@45 -f payment_transaction.pgbench@43 -f order_status.pgbench@4 \
  -f delivery_transaction.pgbench@4 -f stock_check.pgbench@4 tpcc  

# Analyze results / stats, change configs / weights and rinse & repeat until happy :)  

pgbench 天然支持调用多个压测文件, 并可以给每个压测文件定义权重

  -f, --file=FILENAME[@W]  add script FILENAME weighted at W (default: 1)  

# 上面的文件调用比例分别是
  -f new_order.pgbench@45 
  -f payment_transaction.pgbench@43 
  -f order_status.pgbench@4 
  -f delivery_transaction.pgbench@4 
  -f stock_check.pgbench@4 

我试用了一下, 未来还可以继续改进. 例如可以支持绑定变量.

参考

https://github.com/kmoppel/pgbench-tpcc-like

https://kmoppel.github.io/2025-09-06-introducing-pgbench-tpcc-like-toolkit/

《生成泊松、高斯、指数、随机分布数据 - PostgreSQL 9.5 new feature - pgbench improve, gaussian (standard normal) & exponential distribution》

《PostgreSQL pgbench : 冒号处理 常量包含冒号。》

《PostgreSQL 使用 pgbench 测试 sysbench 相关case - pg_oltp_bench》

《PostgreSQL 12 preview - pgbench 压测工具编程能力增强 - gset 支持SQL结果返回并存入变量使用》

《PostgreSQL pgbench client_id 变量用途 - 压测时防止线程间锁冲突(未来,代替动态表名,分区表)》

《股票涨跌幅概率符合高斯分布特征吗? 如何使用PostgreSQL pgbench模拟较为逼真的股票数据?》

《2023-PostgreSQL|PolarDB 学习实验手册》

《沉浸式学习PostgreSQL|PolarDB 12: 如何快速构建 海量 逼真 测试数据》

《PostgreSQL+MySQL 联合解决方案 - 第3课视频 - 如何压测PG数据库、如何瞬间构造海量测试数据》

《PostgreSQL 如何快速构建 海量 逼真 测试数据》

最后附一则济南的线下峰会消息:
PostgreSQL & IvorySQL 2026 年度峰会将于4月份在济南召开,这是目前国内规模最大的PG峰会. 
我是新特性分论坛出品人,欢迎报名参与分享,主委会可解决分享嘉宾住宿和路费。
报名地址:  https://jsj.top/f/uebqBc

议题方向:

  • PostgreSQL 新功能
  • PostgreSQL 内核机制与性能优化
  • PostgreSQL 扩展程序
  • AI + PostgreSQL 技术实践
  • 云原生PostgreSQL或IvorySQL
  • PostgreSQL 用户实践
  • IvorySQL 兼容性与生态实践
  • 基准测试与性能调优
  • 高可用性技术
  • …… 任何与PostgreSQL或IvorySQL相关的内容