# F.30.pg_斯达_声明
F.30.1.这个pg_stat_语句
看法F.30.2.这个pg_统计_报表_信息
看法F.30.3.功能F.30.4.配置参数F.30.5.样本输出F.30.6.作者
这个pg_stat_语句
模块提供了一种跟踪服务器执行的所有SQL语句的计划和执行统计信息的方法。
必须通过添加pg_stat_语句
到共享_预加载_图书馆在里面postgresql。形态
,因为它需要额外的共享内存。这意味着需要重新启动服务器才能添加或删除模块。此外,为了激活模块,必须启用查询标识符计算,如果计算_查询_身份证件即将汽车
或在…上
,或加载计算查询标识符的任何第三方模块。
什么时候pg_stat_语句
处于活动状态时,它会跟踪服务器所有数据库的统计信息。为了访问和处理这些统计信息,该模块提供了视图pg_stat_语句
和pg_统计_报表_信息
,以及效用函数pg_stat_statements_reset
和pg_stat_语句
。这些功能在全球范围内不可用,但可以针对具有创建扩展pg_stat_语句
.
# F.30.1.那个pg_stat_语句
看法
通过名为pg_stat_语句
。对于数据库ID、用户ID、查询ID的每个不同组合,以及它是否为顶级语句(不超过模块可以跟踪的最大不同语句数),此视图包含一行。视图的列显示在中表F.21.
表F.21. pg_stat_语句
柱
列类型 描述 |
---|
用户ID 老年人 (参考文献)pg_authid .老年人 )执行该语句的用户的OID |
dbid 老年人 (参考文献)pg_数据库 .老年人 )执行语句的数据库的OID |
顶层 布尔 如果查询作为顶级语句执行,则为True(如果 pg_stat_声明。轨道 即将顶部 ) |
奎利德 比基特 用于标识相同规范化查询的哈希代码。 |
查询 文本 代表性发言的案文 |
计划 比基特 计划报表的次数(如果有) pg_stat_声明。轨道规划 已启用,否则为零) |
总计划时间 双精度 计划语句所用的总时间,以毫秒为单位(如果需要) pg_stat_声明。轨道规划 已启用,否则为零) |
最小计划时间 双精度 计划语句所用的最短时间,以毫秒为单位(如果需要) pg_stat_声明。轨道规划 已启用,否则为零) |
最大计划时间 双精度 计划语句所用的最长时间,以毫秒为单位(如果 pg_stat_声明。轨道规划 已启用,否则为零) |
平均计划时间 双精度 计划语句所用的平均时间,以毫秒为单位(如果 pg_stat_声明。轨道规划 已启用,否则为零) |
计划时间 双精度 计划报表所用时间的总体标准偏差,以毫秒为单位(如果 pg_stat_声明。轨道规划 已启用,否则为零) |
电话 比基特 执行语句的次数 |
总执行时间 双精度 执行语句所花费的总时间,以毫秒为单位 |
最短执行时间 双精度 执行语句所用的最短时间(毫秒) |
最长执行时间 双精度 执行语句所花费的最大时间(毫秒) |
平均执行时间 双精度 执行语句所花费的平均时间,以毫秒为单位 |
stddev_执行时间 双精度 执行语句所用时间的总体标准偏差,以毫秒为单位 |
排 比基特 检索到的或受语句影响的行总数 |
分享_blks _hit 比基特 语句的共享块缓存命中总数 |
分享_blks_read 比基特 语句读取的共享块总数 |
共享的_blks_dirtied 比基特 被语句弄脏的共享块总数 |
分享_blks_write 比基特 语句写入的共享块总数 |
本地的_blks _hit 比基特 语句的本地块缓存命中总数 |
当地的_blks _read 比基特 语句读取的本地块总数 |
当地的污渍 比基特 被语句弄脏的本地块的总数 |
当地人写的 比基特 语句写入的本地块的总数 |
临时读物 比基特 语句读取的临时块总数 |
临时文件 比基特 语句写入的临时块的总数 |
blk_阅读时间 双精度 语句读取块所用的总时间,以毫秒为单位(如果轨道_木卫一_时机已启用,否则为零) |
blk_写入时间 双精度 语句写入块所用的总时间,以毫秒为单位(如果轨道_木卫一_时机已启用,否则为零) |
沃鲁唱片公司 比基特 语句生成的WAL记录总数 |
瓦卢fpi 比基特 语句生成的WAL整版图像总数 |
wal_字节 数字的 语句生成的WAL总量(字节) |
出于安全原因,只有超级用户和pg_读取所有数据
允许角色查看SQL文本和奎利德
由其他用户执行的查询。但是,如果视图已安装在其他用户的数据库中,则其他用户可以查看统计信息。
可规划查询(即,选择
, 插入
, 使现代化
和删去
)合并成一个pg_stat_语句
根据内部哈希计算,当它们具有相同的查询结构时,输入。通常情况下,如果两个查询在语义上是等价的,除了查询中出现的文本常量的值之外,那么这两个查询将被认为是相同的。然而,实用程序命令(即所有其他命令)严格根据其文本查询字符串进行比较。
# 笔记
以下是有关持续更换和更换的详细信息奎利德
仅适用于以下情况:计算_查询_身份证件已启用。如果你用一个外部模块来计算奎利德
,有关详细信息,请参阅其文档。
如果为了将查询与其他查询匹配而忽略了常量的值,则该常量将替换为参数符号,例如$1
,在pg_stat_语句
陈列查询文本的其余部分是具有特定奎利德
与pg_stat_语句
进入
在某些情况下,具有明显不同文本的查询可能会合并为一个单独的查询pg_stat_语句
进入通常情况下,这种情况只会发生在语义等价的查询中,但散列冲突很可能会导致不相关的查询合并到一个条目中。(但是,对于属于不同用户或数据库的查询,这种情况不会发生。)
自从奎利德
哈希值是根据查询的解析后分析表示来计算的,也可能是相反的:具有相同文本的查询可能会显示为单独的条目,如果它们由于诸如搜索路径
设置。
消费者pg_stat_语句
可能希望使用奎利德
(可能与dbid
和用户ID
)作为每个条目比其查询文本更稳定、更可靠的标识符。然而,有一点很重要,那就是要明白,对该地区的稳定只有有限的保证奎利德
散列值。由于标识符是从解析后分析树派生的,因此它的值是该表示中出现的内部对象标识符的函数。这有一些违反直觉的含义。例如pg_stat_语句
如果引用一个在两个查询的执行之间被删除并重新创建的表,则会考虑两个显然相同的查询。散列过程对机器架构和平台其他方面的差异也很敏感。此外,假设奎利德
将在PostgreSQL的主要版本中保持稳定。
根据经验,奎利德
只有在基础服务器版本和目录元数据详细信息保持完全相同的情况下,才能假定值是稳定的和可比较的。参与基于物理WAL replay的复制的两台服务器可能具有相同的性能奎利德
相同查询的值。然而,逻辑复制方案不能保证副本在所有相关细节上保持一致,因此奎利德
对于跨一组逻辑复制副本累积成本而言,这不是一个有用的标识符。如果有疑问,建议直接测试。
用于替换代表性查询文本中常量的参数符号从最高值后的下一个数字开始$
*n
*原始查询文本中的参数,或$1
如果没有。值得注意的是,在某些情况下,可能存在影响此编号的隐藏参数符号。例如,PL/pgSQL使用隐藏参数符号将函数局部变量的值插入到查询中,这样PL/pgSQL语句选择i+1进入j
有代表性的文本选择i+2美元
.
代表性的查询文本保存在一个外部磁盘文件中,不消耗共享内存。因此,即使非常长的查询文本也可以成功存储。但是,如果累积了许多长的查询文本,外部文件可能会变得非常大。如果发生这种情况,作为一种恢复方法,pg_stat_语句
可以选择放弃查询文本,因此pg_stat_语句
视图将显示空查询
字段,尽管与每个字段关联的统计信息奎利德
它们被保存了下来。如果发生这种情况,考虑减少pg_stat_声明。最大值
防止复发。
计划
和电话
由于计划和执行统计信息在各自的结束阶段进行更新,并且仅针对成功的操作,因此并不总是期望匹配。例如,如果一条语句计划成功,但在执行阶段失败,则只会更新其计划统计信息。如果由于使用缓存的计划而跳过计划,则只会更新其执行统计信息。
# F.30.2.那个pg_统计_报表_信息
看法
统计数字pg_stat_语句
模块本身通过名为pg_统计_报表_信息
。此视图仅包含一行。视图的列显示在中表F.22.
表F.22. pg_统计_报表_信息
柱
列类型 描述 |
---|
释放内存 比基特 总次数 pg_stat_语句 关于执行最少的语句的条目被取消分配,因为它们的不同语句比pg_stat_声明。最大值 观察到 |
统计数据重置 带时区的时间戳 数据库中所有统计数据的时间 pg_stat_语句 上次重置的视图。 |
# F.30.3.功能
pg_stat_语句_reset(userid Oid、dbid Oid、queryid bigint)返回void
pg_stat_statements_reset
丢弃到目前为止收集的统计数据pg_stat_语句
对应于指定的用户ID
, dbid
和奎利德
.如果未指定任何参数,则默认值为0
(无效)用于每个参数,与其他参数匹配的统计信息将被重置。如果未指定任何参数或所有指定的参数0
(无效),它将丢弃所有统计信息。如果所有的统计数据pg_stat_语句
视图被丢弃时,它还会重置pg_统计_报表_信息
看法默认情况下,此功能只能由超级用户执行。其他人可以使用授予
.
pg_stat_语句(showtext boolean)返回一组记录
这个pg_stat_语句
视图是根据一个函数定义的,该函数也被命名为pg_stat_语句
.客户可以致电pg_stat_语句
通过指定showtext:=false
省略查询文本(即出来
与视图的查询
列将返回null)。此功能旨在支持可能希望避免重复检索长度不确定的查询文本的开销的外部工具。这样的工具可以缓存为每个条目观察到的第一个查询文本,因为这就是全部pg_stat_语句
它本身就是这样,然后只在需要时检索查询文本。由于服务器将查询文本存储在一个文件中,这种方法可能会减少重复检查数据的物理I/Opg_stat_语句
数据
# F.30.4.配置参数
pg_stat_声明。最大值
(整数
)
pg_stat_声明。最大值
是模块跟踪的最大语句数(即pg_stat_语句
视图)。如果观察到更多不同的语句,有关执行最少语句的信息将被丢弃。这些信息被丢弃的次数可以在pg_统计_报表_信息
看法默认值为5000.此参数只能在服务器启动时设置。
pg_stat_声明。轨道
(枚举
)
pg_stat_声明。轨道
控制模块对哪些语句进行计数。具体说明顶部
跟踪顶级报表(客户直接发布的报表),全部的
也可以跟踪嵌套语句(例如在函数中调用的语句),或者没有一个
禁用语句统计信息收集。默认值为顶部
。只有超级用户才能更改此设置。
pg_stat_声明。跟踪工具
(布尔值
)
pg_stat_声明。跟踪工具
控制模块是否跟踪实用程序命令。实用程序命令是除选择
, 插入
, 使现代化
和删去
.默认值为在…上
。只有超级用户才能更改此设置。
pg_stat_声明。轨道规划
(布尔值
)
pg_stat_声明。轨道规划
控制模块是否跟踪计划操作和持续时间。启用此参数可能会导致明显的性能损失,尤其是当具有相同查询结构的语句由多个并发连接执行时,这些并发连接会竞争更新少量查询pg_stat_语句
条目。默认值为关
。只有超级用户才能更改此设置。
pg_stat_声明。拯救
(布尔值
)
pg_stat_声明。拯救
指定是否在服务器关闭期间保存语句统计信息。如果是的话关
然后,统计信息不会在关机时保存,也不会在服务器启动时重新加载。默认值为在…上
。此参数只能在postgresql。形态
文件或在服务器命令行上。
该模块需要额外的共享内存,与pg_stat_声明。最大值
。请注意,每当加载模块时,即使pg_stat_声明。轨道
即将没有一个
.
必须在中设置这些参数postgresql。形态
.典型用法可能是:
# postgresql.conf
shared_preload_libraries = 'pg_stat_statements'
compute_query_id = on
pg_stat_statements.max = 10000
pg_stat_statements.track = all
# F.30.5.样本输出
bench=# SELECT pg_stat_statements_reset();
$ pgbench -i bench
$ pgbench -c10 -t300 bench
bench=# \x
bench=# SELECT query, calls, total_exec_time, rows, 100.0 * shared_blks_hit /
nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5;
-[ RECORD 1 ]---+--------------------------------------------------------------------
query | UPDATE pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2
calls | 3000
total_exec_time | 25565.855387
rows | 3000
hit_percent | 100.0000000000000000
-[ RECORD 2 ]---+--------------------------------------------------------------------
query | UPDATE pgbench_tellers SET tbalance = tbalance + $1 WHERE tid = $2
calls | 3000
total_exec_time | 20756.669379
rows | 3000
hit_percent | 100.0000000000000000
-[ RECORD 3 ]---+--------------------------------------------------------------------
query | copy pgbench_accounts from stdin
calls | 1
total_exec_time | 291.865911
rows | 100000
hit_percent | 100.0000000000000000
-[ RECORD 4 ]---+--------------------------------------------------------------------
query | UPDATE pgbench_accounts SET abalance = abalance + $1 WHERE aid = $2
calls | 3000
total_exec_time | 271.232977
rows | 3000
hit_percent | 98.8454011741682975
-[ RECORD 5 ]---+--------------------------------------------------------------------
query | alter table pgbench_accounts add primary key (aid)
calls | 1
total_exec_time | 160.588563
rows | 0
hit_percent | 100.0000000000000000
bench=# SELECT pg_stat_statements_reset(0,0,s.queryid) FROM pg_stat_statements AS s
WHERE s.query = 'UPDATE pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2';
bench=# SELECT query, calls, total_exec_time, rows, 100.0 * shared_blks_hit /
nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5;
-[ RECORD 1 ]---+--------------------------------------------------------------------
query | UPDATE pgbench_tellers SET tbalance = tbalance + $1 WHERE tid = $2
calls | 3000
total_exec_time | 20756.669379
rows | 3000
hit_percent | 100.0000000000000000
-[ RECORD 2 ]---+--------------------------------------------------------------------
query | copy pgbench_accounts from stdin
calls | 1
total_exec_time | 291.865911
rows | 100000
hit_percent | 100.0000000000000000
-[ RECORD 3 ]---+--------------------------------------------------------------------
query | UPDATE pgbench_accounts SET abalance = abalance + $1 WHERE aid = $2
calls | 3000
total_exec_time | 271.232977
rows | 3000
hit_percent | 98.8454011741682975
-[ RECORD 4 ]---+--------------------------------------------------------------------
query | alter table pgbench_accounts add primary key (aid)
calls | 1
total_exec_time | 160.588563
rows | 0
hit_percent | 100.0000000000000000
-[ RECORD 5 ]---+--------------------------------------------------------------------
query | vacuum analyze pgbench_accounts
calls | 1
total_exec_time | 136.448116
rows | 0
hit_percent | 99.9201915403032721
bench=# SELECT pg_stat_statements_reset(0,0,0);
bench=# SELECT query, calls, total_exec_time, rows, 100.0 * shared_blks_hit /
nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5;
-[ RECORD 1 ]---+-----------------------------------------------------------------------------
query | SELECT pg_stat_statements_reset(0,0,0)
calls | 1
total_exec_time | 0.189497
rows | 1
hit_percent |
-[ RECORD 2 ]---+-----------------------------------------------------------------------------
query | SELECT query, calls, total_exec_time, rows, $1 * shared_blks_hit / +
| nullif(shared_blks_hit + shared_blks_read, $2) AS hit_percent+
| FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT $3
calls | 0
total_exec_time | 0
rows | 0
hit_percent |
# F.30.6.作者
板垣隆弘<[itagaki。takahiro@oss.ntt.co.jp](mailto:itagaki。takahiro@oss.ntt.co.jp)>
.Peter Geoghegan添加的查询规范化<[peter@2ndquadrant.com](邮寄至:peter@2ndquadrant.com)>
.