PostgreSQL pg_stat_statements pg_stat_statements 视图

1 背景知识

通过 pg_stat_statements 视图可以查看收集的统计信息。
此视图包括 数据库 ID用户 ID查询 ID(每个语句)的组合都包含一行。

2 视图定义

列类型 说明
userid oid (references pg_authid.oid) 执行该语句的用户的 OID
dbid oid (references pg_database.oid) 在其中执行该语句的数据库的 OID
queryid bigint 内部哈希码,从语句的解析树计算得来
query text 查询文本
plans bigint 计划语句的次数(如果未启用pg_stat_statements.track_planning,则为零)
total_plan_time double precision 计划语句所花费的总时间,以毫秒为单位(如果未启用pg_stat_statements.track_planning,则为零)
min_plan_time double precision 计划语句所花费的最短时间,以毫秒为单位(如果未启用pg_stat_statements.track_planning,则为零)
max_plan_time double precision 计划语句所花费的最长时间,以毫秒为单位(如果未启用pg_stat_statements.track_planning,则为零)
mean_plan_time double precision 计划语句所花费的平均时间,以毫秒为单位(如果未启用pg_stat_statements.track_planning,则为零)
stddev_plan_time double precision 计划语句花费的时间的总体标准偏差,以毫秒为单位(如果未启用pg_stat_statements.track_planning,则为零)
calls bigint 语句被执行的次数
total_exec_time double precision 执行语句所花费的总时间,以毫秒为单位
min_exec_time double precision 执行语句所花费的最短时间,以毫秒为单位
max_exec_time double precision 执行语句所花费的最长时间,以毫秒为单位
mean_exec_time double precision 执行语句的平均时间,以毫秒为单位
stddev_exec_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,则为零)
wal_records bigint 语句生成的 WAL 记录总数
wal_fpi bigint 语句生成的 WAL 整页图像总数
wal_bytes numeric 语句生成的 WAL 字节总数

出于安全性考虑,只有 SuperUser 和授予pg_read_all_stats 角色的成员,允许看到其他用户执行的查询的 SQL 文本或者 queryid

查询的执行计划(即 SELECTINSERTUPDATE 以及 DELETE)根据哈希计算计算后具有相同的查询结构,就会在 pg_stat_statements 视图中显示一行,反之则会显示多行。

这样做的目的是为了能够使两个查询尽可能使两个查询相同,不会由于文本常量值不同而不同。不过,其他命令会严格地以它们的文本查询字符串为基础进行比较。

pg_stat_statements 视图 文本常量值常会显示为一个参数符号,比如 $1 所替换。查询语句的剩余文本显示在 pg_stat_statements 视图 中的 query 字段中。

由于 queryid 哈希值是根据查询被解析和分析后的表达计算的,对立的情况也可能存在:如果具有相同文本的查询由于参数(如不同的 search_path 设置)的原因而具有不同的含义,它们就可能作为不同的项存在。

在使用 pg_stat_statements 视图过程中尽量使用使用 dbiduserid 组合作为一个筛选条件比 query 更方便。

使用 queryid 字段也可以精确查找相关信息。但是,比较遗憾的是,对于 queryid 哈希值的可靠性并不那么稳定。

其次 queryid 是从分析树得来的,它的值是以这种形式出现的内部对象标识符的函数。这对于用户完全无意义。

3 参考链接

PostgreSQL: Documentation: 16: F.32. pg_stat_statements — track statistics of SQL planning and execution