PostgreSQL数据库pg_test_timing学习使用
pg_test_timing 是什么
pg_test_timing 是postgresql数据库提供的一个工具,用来评测操作系统计时效率和开销的,简单的说就是gettimeofday (操作系统方法)返回快慢。
pg_test_timing 使用的原因
目前知道的一个原因是,查看度量SQL执行时间经常使用两种方法\timing SQL 和 explain analyze SQL。但是通常 explain analyze SQL 统计的执行时间长,有些机器长很多。为什么呢,其中一个原因是explain analyze SQL 会为执行的每一个步骤添加计时信息,会有计时的开销。对于计时效率比较差的机器,explain analyze SQL 统计的执行时间就会偏离实际时间很多。下面的例子explain analyze 比\timing 多了5600ms !
例如:
znspgl=# explain analyze select count(*) from (select distinct(c_bh_aj) from db_znspgl.t_zlglpt_wt where d_cjrq between '20160913' and '20170909' ) t;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=347567.23..347567.24 rows=1 width=0) (actual time=6954.845..6954.846 rows=1 loops=1)
-> Unique (cost=0.56..343310.31 rows=340554 width=33) (actual time=0.034..5969.209 rows=1322165 loops=1)
-> Index Only Scan using i_zlglpt_wt_zh01 on t_zlglpt_wt (cost=0.56..336784.36 rows=2610380 width=33) (actual time=
0.031..2840.502 rows=2644330 loops=1)
Index Cond: ((d_cjrq >= '2016-09-13'::date) AND (d_cjrq <= '2017-09-09'::date))
Heap Fetches: 0
Planning time: 0.172 ms
Execution time: 6954.890 ms
(7 rows)
znspgl=# \timing on
Timing is on.
znspgl=# select count(*) from (select distinct(c_bh_aj) from db_znspgl.t_zlglpt_wt where d_cjrq between '20160913' and '20170909' ) t;
count
---------
1322165
(1 row)
Time: 1322.715 ms
pg_test_timing 如何使用
pg_test_timing 位于PostgresSQL的安装目录下/bin 目录中,即$PGHOME/bin/pg_test_timing。和其他的linux命令使用方法一样,pg_test_timing --help可以查看用法。
- 示例1:
[thunisoft@bogon ~]$ pg_test_timing
Testing timing overhead for 3 seconds.
Per loop time including overhead: 22.37 nsec
Histogram of timing durations:
< usec % of total count
1 97.77008 131116962
2 2.22722 2986862
4 0.00217 2910
8 0.00004 55
16 0.00048 644
32 0.00001 18
64 0.00000 3
128 0.00000 2
- 示例2:
[thunisoft@localhost ~]$ pg_test_timing
Testing timing overhead for 3 seconds.
Per loop time including overhead: 63.10 nsec
Histogram of timing durations:
< usec % of total count
1 93.92173 44651011
2 6.06895 2885219
4 0.00044 209
8 0.00096 455
16 0.00294 1398
32 0.00393 1867
64 0.00036 169
128 0.00031 145
256 0.00035 166
512 0.00004 18
1024 0.00000 2
2048 0.00000 1
pg_test_timing 结果如何评判
首先,看Per loop time including overhead(平均每次循环开销)。
示例1的平均每次循环开销 为22纳秒
示例2的平均每次循环开销 为63纳秒
其次,看柱状图统计。
示例1,显示97%的循环在1微秒(100纳秒)内完成
示例2,显示93%的循环在1微秒(100纳秒)内完成
好的机器应该显示90%的调用都在1微秒(100纳秒)内完成