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 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
    • 删除了选项 -P(提交 4192f2d8
  • 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" 的评论、建议或更正 此处