为什么我的平均值比使用 hyperfine 来基准查询性能的执行时间大得多?

问题描述 投票:0回答:1
                                           QUERY PLAN                                                                                        

GroupAggregate(成本=21267.11..21286.98行=461宽度=31)(实际时间=1.711..1.712行=1循环=1) 组键:* ->排序(成本=21267.11..21268.91行=719宽度=35)(实际时间=1.564..1.591行=719循环=1) 排序键:* 排序方式:快速排序内存:69kB -> 嵌套循环(成本=70.03..21233.00行=719宽度=35)(实际时间=0.483..1.454行=719循环=1) -> 使用*进行索引扫描(成本=0.28..8.30行=1宽度=27)(实际时间=0.017..0.018行=1循环=1) 指数条件:* -> 对测量 m 进行位图堆扫描(成本 = 69.75..21213.91 行 = 719 宽度 = 32)(实际时间 = 0.240..0.994 行 = 719 循环 = 1) 重新检查条件:* 筛选: * 筛选器删除的行数:5241 堆块:精确=50 -> 位图索引扫描*(成本=0.00..69.57行=6018宽度=0)(实际时间=0.224..0.224行=5960循环=1) 指数条件:* 规划时间:0.697 ms 执行时间:1.766 ms (17行)

                                          QUERY PLAN                                                                                        

GroupAggregate(成本=21267.11..21286.98行=461宽度=31)(实际时间=0.897..0.898行=1循环=1) 组键:* ->排序(成本=21267.11..21268.91行=719宽度=35)(实际时间=0.795..0.831行=719循环=1) 排序键:* 排序方式:快速排序内存:69kB -> 嵌套循环(成本=70.03..21233.00行=719宽度=35)(实际时间=0.178..0.718行=719循环=1) -> 使用*进行索引扫描(成本=0.28..8.30行=1宽度=27)(实际时间=0.004..0.005行=1循环=1) 指数条件:* -> 对测量 m 进行位图堆扫描(成本 = 69.75..21213.91 行 = 719 宽度 = 32)(实际时间 = 0.081..0.457 行 = 719 循环 = 1) 重新检查条件:* 筛选: * 筛选器删除的行数:5241 堆块:精确=50 -> 位图索引扫描*(成本=0.00..69.57行=6018宽度=0)(实际时间=0.073..0.073行=5960循环=1) 指数条件:* 规划时间:0.336 ms 执行时间:0.929毫秒 (17行)

                                          QUERY PLAN                                                                                        

GroupAggregate(成本=21267.11..21286.98行=461宽度=31)(实际时间=0.873..0.873行=1循环=1) 组键:* ->排序(成本=21267.11..21268.91行=719宽度=35)(实际时间=0.794..0.813行=719循环=1) 排序键:* 排序方式:快速排序内存:69kB -> 嵌套循环(成本=70.03..21233.00行=719宽度=35)(实际时间=0.168..0.717行=719循环=1) -> 使用*进行索引扫描(成本=0.28..8.30行=1宽度=27)(实际时间=0.004..0.004行=1循环=1) 指数条件:* -> 对测量 m 进行位图堆扫描(成本=69.75..21213.91 行=719 宽度=32)(实际时间=0.071..0.457 行=719 循环=1) 重新检查条件:* 筛选: * 筛选器删除的行数:5241 堆块:精确=50 -> 位图索引扫描* (成本=0.00..69.57行=6018宽度=0)(实际时间=0.063..0.063行=5960循环=1) 指数条件:* 规划时间:0.304 ms 执行时间:0.903毫秒 (17行)

------------------------------------------------- -------------------------------------------------- ------------

时间(平均值 ± σ):98.1 ms ± 28.1 ms [用户:30.7 ms,系统:11.1 ms]范围(最小值 … 最大值):75.6 ms … 129.5 ms 3 次运行

------------------------------------------------- -------------------------------------------------- ------------

我正在使用 hyperfine 来对 PostgreSQL 中的查询性能进行基准测试。我使用

--runs 3
选项运行了三次。正如您所看到的,我运行查询的所有 3 次的执行时间分别花费了 1.766、0.929 和 0.903 毫秒。我的问题是,为什么平均值 = 98.1 毫秒?这句话代表什么意思呢?因为执行时间在 0.9 ms - 1.7 ms 之间没有任何意义,而它们的平均值是 98.1 ms。我测试在 Postico 中执行相同的查询,花费了 0.903 毫秒。我只是好奇如果平均值不代表执行平均时间,它代表什么。

postgresql time mean execution standard-deviation
1个回答
0
投票

我的印象是,Hyperfine 测量完整的端到端调用,包括访问容器、启动 psql 和执行查询。如果您只想测量查询,

pgbench
可能是一个更好的工具。它可以将文件作为输入,并包含您的特定查询。请参阅https://www.postgresql.org/docs/current/pgbench.html

© www.soinside.com 2019 - 2024. All rights reserved.