postgresql 查找慢sql之二: pg_stat_statements

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/ctypyb2002/article/details/83151836

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 为特定数据库启用它们。

apt 、yum 安装

需要安装相同版本的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

由于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)

查找top sql

top io sql

平均单次 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;

top time sql

平均 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;

top shared memory

select userid::regrole, dbid, query from pg_stat_statements order by (shared_blks_hit+shared_blks_dirtied) desc limit 20;

top temp memory

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

猜你喜欢

转载自blog.csdn.net/ctypyb2002/article/details/83151836