pgbench

用于运行基准测试的实用程序

pgbench 是一个 核心实用程序,用于在 PostgreSQL 上运行基准测试。

pgbench 已在 PostgreSQL 7.0 中添加。

用法

pgbench 能够生成一组样本数据,并对这些数据运行一组默认查询(大致基于 TPC-B);或者,也可以执行用户提供的自定义脚本。

默认数据和查询

如果使用内置的基准测试功能,pgbench 需要执行两次:一次初始化数据,一次运行基准测试查询。

初始化步骤使用 pgbench -i 执行;将创建四个表(默认情况下,具有相同名称的现有表将被删除)。三个表将预先填充生成的数据;数据量由 -s/--scale 选项控制(默认值:1)。下表显示了在不同比例因子下生成的表和插入的行数。

  1 10 100
pgbench_branches 1 10 100
pgbench_tellers 10 100 1,000
pgbench_accounts 100,000 1,000,000 10,000,000
pgbench_history 0 0 0

默认情况下,行是作为客户端生成的单个 INSERT 语句插入的。如果 -I/--init-steps 选项包含 G 标志,则数据将使用 generate_series() 创建。

生成数据后,可以第二次执行 pgbench,以多次运行内置的 TPC-B 类事务。每个事务运行以下命令:

\set aid random(1, 100000 * :scale)
\set bid random(1, 1 * :scale)
\set tid random(1, 10 * :scale)
\set delta random(-5000, 5000)
BEGIN;
UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
END;

变更历史

开发中

  • PostgreSQL 18
    • 与失败事务相关的结果输出得到改进(提交 cae0f3c4
    • 如果需要,RLIMIT_NOFILE 将被动态增加(提交 d38bab5e
  • PostgreSQL 17
    • 使用 COPY 进行所有客户端数据生成(提交 e35cc3b3
    • 添加了选项 --exit-on-abort(提交 3c662643
    • 添加了元命令 \syncpipeline(提交 94edfe25
    • 选项 -d 作为 --debug 的简写已被 -d/--database 选项替换(提交 3ff01b2b
  • PostgreSQL 15
    • 使用 COPY FREEZE 加快基准测试表填充速度(提交 06ba4a63
    • 添加了以下选项(提交 4a39f87a
      • --max-tries
      • --failures-detailed
      • --verbose-errors
  • PostgreSQL 14
    • 通过新命令 \startpipeline\endpipeline 添加了 libpq 管道支持(提交 9aa491ab
  • PostgreSQL 13
    • 添加了选项 --partitions--partition-method(提交 b1c1aa53
    • 选项 --init-steps 接受 G 以在服务器端生成数据,而不是由客户端生成(提交 a386942b
    • 添加了选项 --show-script 来转储内置脚本的内容(提交 5823677a
    • 添加了 \aset 命令,它类似于 \gset,但能够将组合 SQL 查询的所有结果存储到单独的变量中(提交 9d8ef988
  • PostgreSQL 12
    • 添加了 \gset 命令(初始提交 6260cc55
    • 提高了 --rate 选项的精度(提交 5b7e0367
    • 改进了错误报告(提交 5b75a4f8
    • 变量/参数的最大数量从 10 增加到 256(提交 a4784152
  • PostgreSQL 11
    • 重大脚本语言改进(提交 bc7fa0c1
    • 添加了 pow() / power() 函数(提交 7a727c18
    • 添加了 \if 支持(提交 f67b113a
    • 变量名中允许使用非 ASCII 字符(提交 9d36a386
    • 添加了哈希函数 hash()hash_murmur2()hash_fnv1a()(提交 e51a0484
    • 添加了 random_zipfian() 函数(提交 1fcd0ade
    • 添加了选项 --init-steps(提交 591c504f
    • 添加了选项 --random-seed(提交 64f85894
    • 使用 --latency-limit--rate 生成的统计数据的准确性得到提高(提交 c23bb6ba16827d44
  • PostgreSQL 9.5
  • PostgreSQL 9.4
    • 添加了选项 --rate(初始提交 fc9f4e9f
    • 添加了选项 --progress(初始提交 4a87f308
    • 移除了自定义脚本文件中硬编码的行长度限制(提交 61a07bae
    • 添加了长选项(提交 79cddb18
  • PostgreSQL 9.3
    • 添加了选项 --aggregate-interval(提交 6a651d85
    • 添加了选项 --foreign-keys(提交 afe1c51c
    • 添加了选项 -q(静默模式)(提交 cf03ff6c
    • 添加了选项 --sampling-rate(提交 e1be1df5
    • 选项 -i 现在发出的状态消息减少了十分之一(提交 47c7365e
    • 可以使用大于 21474 的比例因子(提交 89d00cbe
    • 现在设置 fallback_application_name (提交 17676c78)
  • PostgreSQL 9.2
    • 添加了选项 --tablespace(提交 7c263956
    • 添加了选项 --index-tablespace(提交 7c263956
    • 添加了选项 --unlogged-tables(提交 2d6fee09
  • PostgreSQL 8.4
    • 添加了 -M 选项用于指定要使用的查询协议类型(提交 49639a7b
    • 添加了 -T 选项用于指定持续时间(秒)(提交 cff4aa6a
    • 标准表 accountsbrancheshistorytellers 前面添加了 pgbench_ 前缀(提交 48caf91b
  • PostgreSQL 8.3
  • PostgreSQL 7.0

示例

默认测试

pgbench 提供的默认测试需要将一套示例表和数据安装到目标数据库中;这通过以下方式完成:

pgbench -i  [ other-options ] dbname

其中 other-options 应包括 psql 和其他 libpq 客户端使用的相同 连接参数

再次执行 pgbench 而不带 -i 选项将执行一个基本测试,例如:

postgres:~$ pgbench -U postgres testdb
starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
number of transactions per client: 10
number of transactions actually processed: 10/10
tps = 108.049703 (including connections establishing)
tps = 110.750557 (excluding connections establishing)

默认选项未提供特别有用的输出;用于调优 pgbench 最有用的选项是:

  • -c(客户端数量)
  • -t(事务数量)
  • -T(时间限制)
  • PostgreSQL 社区维基: Pgbench

分类

Contrib 模块, 性能

反馈

提交有关“pgbench”的任何评论、建议或更正,请在此处 提交