sqlbench:一个测量和比较 SQL 语句执行效率的工具

文章目录

        sqlbench 安装
        使用案例
        命令行参数

今天给大家介绍一个可以用于测量和比较不同 SQL 语句执行时间的开源工具:sqlbench。如果觉得文章对你有用,欢迎评论📝、点赞👍、推荐🎁

sqlbench 是一个使用 Go 语言开发的 SQL 性能测试工具,主要用于开发环境中不同 SQL 语句执行效率(CPU)的测量和比较。sqlbench 遵循 MIT 开源协议,支持 Windows、Linux 以及 macOS 平台,目前支持 PostgreSQL 数据库。
sqlbench 安装

sqlbench 提供了二进制安装包,可以在 GitHub 上直接下载。如果已经安装了 Go 1.13 或者更高版本,也可以通过源码安装或者升级 sqlbench:

$ go get -u github.com/felixge/sqlbench

使用案例

假如我们需要比较三种不同查询语句计算从 1 到 1000 累计总和的性能。第一种方法是使用窗口函数:

SELECT i, sum(i) OVER (ORDER BY i) AS sum
FROM generate_series(1, 1000) g(i);

第二种方法是使用递归通用表表达式(WITH 子句):

WITH RECURSIVE sums AS (
    SELECT 1 AS i, 1 AS sum
    UNION
    SELECT i+1, sum+i FROM sums WHERE i <= 1000
)

SELECT * FROM sums;

第三种方法是使用高斯求和公式:

SELECT i, (i * (i + 1)) / 2 AS sum
FROM generate_series(1, 1000) g(i);

我们可以分别将它们保存为 3 个文件:window.sql、recursive.sql、gauss.sql;或者使用 sqlbench 源码 examples 目录中提供的示例文件。现在我们想要比较它们的性能差异,输入以下命令分别运行 1000 次上述 3 个查询语句,返回执行时间的统计、PostgreSQL 版本以及执行的 SQL 语句等:

$ ./sqlbench -c postgres://tony:Pswd!1234@192.168.56.104:5432/hrdb -v -n 1000 ./examples/sum/*.sql

其中,-c 用于指定数据库连接,tony:Pswd!1234 是用户名和密码,192.168.56.104 是 PostgreSQL 服务器地址,5432 是服务端口,hrdb 是连接的数据库名;-v 用于打印详细信息,包括所有的 SQL 查询和 PostgreSQL 版本;-n 表示运行查询的次数;最后是要执行的 SQL 脚本文件。

执行以上命令会在终端不停刷新统计数据,最终返回以下结果:

         | gauss |    window    |  recursive    
---------+-------+--------------+---------------
  n      |  1000 |         1000 |         1000  
  min    |  0.18 | 0.64 (3.59x) | 0.95 (5.31x)  
  max    |  0.51 | 1.80 (3.51x) | 3.36 (6.53x)  
  mean   |  0.22 | 0.81 (3.66x) | 1.19 (5.40x)  
  stddev |  0.05 | 0.18 (3.97x) | 0.26 (5.62x)  
  median |  0.21 | 0.77 (3.64x) | 1.13 (5.35x)  
  p90    |  0.24 | 0.85 (3.59x) | 1.29 (5.48x)  
  p95    |  0.26 | 1.09 (4.23x) | 1.37 (5.34x)  

Stopping after 1000 iterations as requested.

postgres version: PostgreSQL 13.0, compiled by Visual C++ build 1914, 64-bit
sqlbench -c postgres://tony:Pswd!1234@192.168.56.104:5432/hrdb -v -n 1000 ./examples/sum/gauss.sql ./examples/sum/recursive.sql ./examples/sum/window.sql

==> ./examples/sum/gauss.sql <==
SELECT i, (i * (i + 1)) / 2 AS sum
FROM generate_series(1, 1000) g(i);

==> ./examples/sum/window.sql <==
SELECT i, sum(i) OVER (ORDER BY i) AS sum
FROM generate_series(1, 1000) g(i);

==> ./examples/sum/recursive.sql <==
WITH RECURSIVE sums AS (
    SELECT 1 AS i, 1 AS sum
    UNION
    SELECT i+1, sum+i FROM sums WHERE i <= 1000
)

SELECT * FROM sums;

输出结果返回了执行次数 n,最小执行时间 min,最大执行时间 max,平均执行时间 mean,执行时间标准差 stddev,执行时间中位数 median,百分之九十的执行时间 p90 和百分之九十五的执行时间 p95。最左边的列是平均执行时间最少的查询,右边的列显示了和最快查询的比较。从执行的结果可以看出,高斯求和公式的性能最好,然后是窗口函数,递归通用表表达式的性能最差。

默认情况下,sqlbench 为查询语句加上了 EXPLAIN (ANALYZE, TIMING OFF) 前缀并且记录总的执行时间。如果增加 -m client 参数,可以基于 sqlbench 客户端的时间统计不同 SQL 语句的性能,包括了网络传输的时间消耗:
 

更多请见:http://www.mark-to-win.com/tutorial/51605.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值