查看PG日志
不是很熟悉PG这个功能,所以感觉非常不方便。毕竟是以用为主。
扩展pg_stat_statements
1、修改postgresql.conf配置参数,默认pg数据库你要的日志是没有打开。
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 1000
pg_stat_statements.track = all #抓取所有sql
2、安装扩展
create extension pg_stat_statements;
注意重启PG。
3、查看执行的sql
select pg_stat_statements_reset() ;
select * from pg_stat_statements;
or
SELECT query, calls, total_time, (total_time/calls) as average ,rows,
100.0 * shared_blks_hit /nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements
ORDER BY average DESC LIMIT 10;
补课:
F.28. pg_stat_statements
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 为特定数据库启用。
F.28.1. pg_stat_statements视图
该模块收集的统计信息通过一个名为 pg_stat_statements的系统视图提供。 这个视图为每个不同的数据库 ID、用户 ID 和查询 ID (最多到该模块可以追踪的不同语句的最大数量)包含一行。该视图的列显示在 表 F-20中。
表 F-20. pg_stat_statements列
名称 | 类型 | 引用 | 描述 |
---|---|---|---|
userid | oid | pg_authid.oid | 执行该语句的用户的 OID |
dbid | oid | pg_database.oid | 在其中执行该语句的数据库的 OID |
queryid | bigint | 内部哈希码,从语句的解析树计算得来 | |
query | text | 语句的文本形式 | |
calls | bigint | 被执行的次数 | |
total_time | double precision | 在该语句中花费的总时间,以毫秒计 | |
min_time | double precision | 在语句中花费的最短时间,以毫秒为单位 | |
max_time | double precision | 在语句中花费的最长时间,以毫秒为单位 | |
mean_time | double precision | 在语句中花费的平均时间,以毫秒为单位 | |
stddev_time | double precision | 在语句中花费的人口标准偏差时间,以毫秒为单位 | |
rows | bigint | 该语句检索或影响的行总数 | |
shared_blks_hit | bigint | 该语句造成的共享块缓冲命中总数 | |
shared_blks_read | bigint | 该语句读取的共享块的总数 | |
shared_blks_dirtied | bigint | 该语句弄脏的共享块的总数 | |
shared_blks_written | bigint | 该语句写入的共享块的总数 | |
local_blks_hit | bigint | 该语句造成的本地块缓冲命中总数 | |
local_blks_read | bigint | 该语句读取的本地块的总数 | |
local_blks_dirtied | bigint | 该语句弄脏的本地块的总数 | |
local_blks_written | bigint | 该语句写入的本地块的总数 | |
temp_blks_read | bigint | 该语句读取的临时块的总数 | |
temp_blks_written | bigint | 该语句写入的临时块的总数 | |
blk_read_time | double precision | 该语句花在读取块上的总时间,以毫秒计(如果track_io_timing 被启用,否则为零) | |
blk_write_time | double precision | 该语句花在写入块上的总时间,以毫秒计(如果track_io_timing 被启用,否则为零) |
出于安全原因,不允许非超级用户查看其它用户执行的 SQL 文本或者 queryid。 不过,如果视图已经安装到他们的数据库中,他们就可以查看统计信息。
F.28.2. 函数
pg_stat_statements_reset() returns void
-
pg_stat_statements_reset
抛弃目前由pg_stat_statements 收集的所有统计信息。默认情况下,这个函数只能被超级用户执行。 pg_stat_statements(showtext boolean) returns setof record
-
pg_stat_statements视图按照一个也叫
pg_stat_statements
的函数来定义。客户端可以直接调用pg_stat_statements
函数,并且通过指定 showtext := false来忽略查询文本(即,对应于视图的 query列的OUT参数将返回空值)。 这个特性是为了支持不想重复接收长度不定的查询文本的外部工具而设计的。 这类工具可以转而自行缓存第一个观察到的查询文本,因为这就是 pg_stat_statements自己所做的全部工作,并且只在需要的时候检索查询文本。 因为服务器会把查询文本存储在一个文件中,这种方法可以降低重复检查 pg_stat_statements数据的物理 I/O。
F.28.3. 配置参数 pg_stat_statements.max (integer)
-
pg_stat_statements.max是该模块跟踪的语句的最大数目 (即pg_stat_statements视图中行的最大数量)。 如果观测到的可区分的语句超过这个数量,最少被执行的语句的信息将会被丢弃。 默认值为 5000。这个参数只能在服务器启动时设置。
- pg_stat_statements.track (enum)
-
pg_stat_statements.track控制哪些语句会被该模块计数。 指定top可以跟踪顶层语句(那些直接由客户端发出的语句), 指定all还可以跟踪嵌套的语句(例如在函数中调用的语句), 指定none可以禁用语句统计信息收集。默认值是top。 只有超级用户能够改变这个设置。
- pg_stat_statements.track_utility (boolean)
-
pg_stat_statements.track_utility控制该模块是否会跟踪工具命令。 工具命令是除了SELECT、INSERT、 UPDATE和DELETE之外所有的其他命令。默认值是on。 只有超级用户能够改变这个设置。
- pg_stat_statements.save (boolean)
-
pg_stat_statements.save 指定在服务器关闭之后是否还保存语句统计信息。如果被设置为off, 那么关闭后不保存统计信息并且在服务器启动时也不会重新载入统计信息。 默认值为on。这个参数只能在postgresql.conf 文件中或者在服务器命令行上设置。
该模块要求与pg_stat_statements.max成比例的额外共享内存。 注意只要该模块被载入就会消耗这么多的内存,即便 pg_stat_statements.track被设置为none。
这些参数必须在postgresql.conf中设置。典型的用法可能是:
# postgresql.conf shared_preload_libraries = 'pg_stat_statements' pg_stat_statements.max = 10000 pg_stat_statements.track = all |