赞
踩
pg_stat_statements模块提供一种方法追踪一个服务器所执行的所有 SQL 语句的执行统计信息。
该模块必须通过在 postgresql.conf 的 shared_preload_libraries 中增加pg_stat_statements 来载入,因为它需要额外的共享内存。这意味着增加或移除该模块需要一次服务器重启。
当 pg_stat_statements 被载入时,它会跟踪该服务器 的所有数据库的统计信息。该模块提供了一个视图 pg_stat_statements 以及函数 pg_stat_statements_reset 和pg_stat_statements 用于访问和操纵这些统计信息。这些视图 和函数不是全局可用的,但是可以用 CREATE EXTENSION pg_stat_statements 为特定数据库启用它们。
需要安装相同版本的contrib包,以ubuntu为例。
# apt install postgresql-contrib-9.6
# dpkg -l |grep -i postgresql-contrib-9.6
ii postgresql-contrib-9.6 9.6.8-1.pgdg16.04+1 amd64 additional facilities for PostgreSQL
编译安装时如果是如下方式,则已经安装了。
$ make world
$ make install-world
否则,需要进入到源码的 \contrib\pg_stat_statements\ 下单独编译安装
$ cd /tmp/postgresql-9.6.8\contrib\pg_stat_statements\
$ make
$ make install
由于pg_stat_statements 既使用了hook,同时又是以 extension 形式被使用,所以需要做两件事情:
1、修改 postgrsql.conf 的 shared_preload_libraries 值后,重启postgresql。
$ vi postgresql.conf
shared_preload_libraries = 'pg_stat_statements' # (change requires restart)
# systemctl stop postgresql
# systemctl start postgresql
2、创建 extension
由于pg_stat_statements针对的是数据库级别,所以需要首先进入指定数据库
postgres=# \c peiybdb
peiybdb=# create extension pg_stat_statements;
创建好后,多出一个视图 pg_stat_statements 和 两个函数 pg_stat_statements_reset;
peiybdb=# \df
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+--------------------------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------
public | pg_stat_statements | SETOF record | showtext boolean, OUT userid oid, OUT dbid oid, OUT queryid bigint, OUT query text, OUT calls bigint, OUT total_time double precision, OUT min_time double precision, OUT max_time double precision, OUT mean_time double precision, OUT stddev_time double precision, OUT rows bigint, OUT shared_blks_hit bigint, OUT shared_blks_read bigint, OUT shared_blks_dirtied bigint, OUT shared_blks_written bigint, OUT local_blks_hit bigint, OUT local_blks_read bigint, OUT local_blks_dirtied bigint, OUT local_blks_written bigint, OUT temp_blks_read bigint, OUT temp_blks_written bigint, OUT blk_read_time double precision, OUT blk_write_time double precision | normal
public | pg_stat_statements_reset | void | | normal
(2 rows)
peiybdb=# \df+ pg_stat_statements
List of functions
Schema | Name | Result data type | Argument data types | Type | Volatility | Parallel | Owner | Security | Access privileges | Language | Source code | Description
--------+--------------------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------+----------+----------+----------+-------------------+----------+------------------------+-------------
public | pg_stat_statements | SETOF record | showtext boolean, OUT userid oid, OUT dbid oid, OUT queryid bigint, OUT query text, OUT calls bigint, OUT total_time double precision, OUT min_time double precision, OUT max_time double precision, OUT mean_time double precision, OUT stddev_time double precision, OUT rows bigint, OUT shared_blks_hit bigint, OUT shared_blks_read bigint, OUT shared_blks_dirtied bigint, OUT shared_blks_written bigint, OUT local_blks_hit bigint, OUT local_blks_read bigint, OUT local_blks_dirtied bigint, OUT local_blks_written bigint, OUT temp_blks_read bigint, OUT temp_blks_written bigint, OUT blk_read_time double precision, OUT blk_write_time double precision | normal | volatile | safe | postgres | invoker | | c | pg_stat_statements_1_3 |
(1 row)
peiybdb=# \d List of relations Schema | Name | Type | Owner --------+--------------------+-------+---------- public | pg_stat_statements | view | postgres peiybdb=# \d+ pg_stat_statements View "public.pg_stat_statements" Column | Type | Modifiers | Storage | Description ---------------------+------------------+-----------+----------+------------- userid | oid | | plain | dbid | oid | | plain | queryid | bigint | | plain | query | text | | extended | calls | bigint | | plain | total_time | double precision | | plain | min_time | double precision | | plain | max_time | double precision | | plain | mean_time | double precision | | plain | stddev_time | double precision | | plain | rows | bigint | | plain | shared_blks_hit | bigint | | plain | shared_blks_read | bigint | | plain | shared_blks_dirtied | bigint | | plain | shared_blks_written | bigint | | plain | local_blks_hit | bigint | | plain | local_blks_read | bigint | | plain | local_blks_dirtied | bigint | | plain | local_blks_written | bigint | | plain | temp_blks_read | bigint | | plain | temp_blks_written | bigint | | plain | blk_read_time | double precision | | plain | blk_write_time | double precision | | plain | View definition: SELECT pg_stat_statements.userid, pg_stat_statements.dbid, pg_stat_statements.queryid, pg_stat_statements.query, pg_stat_statements.calls, pg_stat_statements.total_time, pg_stat_statements.min_time, pg_stat_statements.max_time, pg_stat_statements.mean_time, pg_stat_statements.stddev_time, pg_stat_statements.rows, pg_stat_statements.shared_blks_hit, pg_stat_statements.shared_blks_read, pg_stat_statements.shared_blks_dirtied, pg_stat_statements.shared_blks_written, pg_stat_statements.local_blks_hit, pg_stat_statements.local_blks_read, pg_stat_statements.local_blks_dirtied, pg_stat_statements.local_blks_written, pg_stat_statements.temp_blks_read, pg_stat_statements.temp_blks_written, pg_stat_statements.blk_read_time, pg_stat_statements.blk_write_time FROM pg_stat_statements(true) pg_stat_statements(userid, dbid, queryid, query, calls, total_time, min_time, max_time, mean_time, stddev_time, rows, shared_blks_hit, shared_blks_read, shared_blks_dirtied, shared_blks_written, local_blks_hit, local_blks_read, local_blks_dirtied, local_blks_written, temp_blks_read, temp_blks_written, blk_read_time, blk_write_time);
可以使用 pg_stat_statements_reset() 函数来重置 pg_stat_statements,方便阶段性的分析慢sql,比如专项优化、大版本上线监控。
peiybdb=# select pg_stat_statements_reset();
pg_stat_statements_reset
--------------------------
(1 row)
peiybdb=#
peiybdb=#
peiybdb=# select count(1) from pg_stat_statements;
count
-------
1
(1 row)
平均单次 io
select userid::regrole, dbid, query from pg_stat_statements order by (blk_read_time+blk_write_time)/calls desc limit 20;
累计 io
select userid::regrole, dbid, query from pg_stat_statements order by (blk_read_time+blk_write_time) desc limit 20;
平均 time
select userid::regrole, dbid, query from pg_stat_statements order by mean_time desc limit 20;
累计 time
select userid::regrole, dbid, query from pg_stat_statements order by total_time desc limit 20;
不稳定,时快时慢
select userid::regrole, dbid, query from pg_stat_statements order by stddev_time desc limit 20;
select userid::regrole, dbid, query from pg_stat_statements order by (shared_blks_hit+shared_blks_dirtied) desc limit 20;
select userid::regrole, dbid, query from pg_stat_statements order by temp_blks_written desc limit 20;
参考:
http://postgres.cn/docs/9.6/pgstatstatements.html
https://blog.csdn.net/ctypyb2002/article/details/77711802
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。