爽! 用 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相关的内容