PostgreSQL 12: pgbench 新增 \gset 命令支持将SQL结果存入变量

PostgreSQL 自带的 pgbench 是一个非常方便的压测试工具,适用于较简单的测试用例,若测试场景比较复杂,可以将业务逻辑写在 PostgreSQL 函数中,之后通过 pgbench 调用函数进行压力测试。

PostgreSQL 12 版本 pgbench 压测工具得到增强,新增 ‘\gset’ 命令可以将SQL返回的一个结果存储在变量中,这个变量可以被 pgbench 后面的SQL脚本引用。

发行说明

Allow values produced by queries to be assigned to pgbench variables (Fabien Coelho, Álvaro Herrera)

The commands is \gset.

\gset 语法

\gset [prefix]

pgbench 的 ‘\gset’ 语法比较简单,注意以下:

  • ‘\gset’ 可以用来结束SQL,相当于SQL尾部添加了分号。
  • ‘\gset ‘ 适用于SQL仅返回一条记录的场景
  • 变量名为SQL返回的字段名称,变量名可以加前缀。

本文演示下 pgbench 的 ‘\gset’ 命令简单使用。

环境准备

创建 user1 和 user1_change_log 表,如下:

1
2
3
4
5
6
7
8
9
10
mydb=> CREATE TABLE user1 (userid int4, username character varying(32),regtime timestamp without time zone);
CREATE TABLE

mydb=> INSERT INTO user1 (userid,username,regtime) SELECT n, 'user' || n, now() FROM generate_series(1,10000000) n;
INSERT 0 10000000

mydb=> ALTER TABLE user1 ADD PRIMARY KEY(userid);
ALTER TABLE
^
mydb=> CREATE TABLE user1_change_log( new_username character varying(32),change_time timestamp without time zone);

pgbench \gset 演示

编写 tran1.sql 脚本,如下:

1
2
3
4
5
\set v_id random(1,1000000)

UPDATE user1 SET username='updated'||:v_id WHERE userid=:v_id RETURNING username \gset p_

INSERT INTO user1_change_log(new_username,change_time) VALUES (:p_username, clock_timestamp());

以上脚本使用了 ‘\gset’ 命令设置变量 p_username,首先将第一条 UPDATE 返回更新后的数据存储在变量 p_username ,第二条 SQL 将 p_username 变量获取的值插入表 user1_change_log 中。

pgbench 压力测试,如下:

1
2
3
4
5
6
7
8
9
10
11
[pg12@pghost2 pgbench]$ pgbench -n -Mprepared -c 2 -j 2 -T 60 -U pguser mydb -f tran1.sql
transaction type: tran1.sql
scaling factor: 1
query mode: prepared
number of clients: 2
number of threads: 2
duration: 60 s
number of transactions actually processed: 164289
latency average = 0.730 ms
tps = 2738.022704 (including connections establishing)
tps = 2738.214497 (excluding connections establishing)

以上是在笔记本虚机测试,性能较低,性能数据可忽略。

验证表 user1_change_log 数据,如下:

1
2
3
4
5
6
7
mydb=> SELECT * FROM user1_change_log LIMIT 3;
new_username | change_time
---------------+----------------------------
updated117555 | 2019-07-26 10:15:36.161434
updated256083 | 2019-07-26 10:15:36.163289
updated213653 | 2019-07-26 10:15:36.163319
(3 rows)

总结

pgbench 新增 \gset 命令支持将SQL结果存入变量,’pgbench’ 编程能力得到增强,可以应对稍复杂些的测试用例,若测试用例较复杂,建议将测试用例写在 PostgreSQL 的函数中,之后通过 ‘pgbench’ 调用进行压测。

参考

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

购买链接:https://item.jd.com/12405774.html

PostgreSQL实战
感谢支持!
0%