auto_explain
模块提供了一种自动记录慢语句执行计划的方法,无需手动运行 EXPLAIN。这对于跟踪大型应用程序中未优化的查询特别有用。
该模块不提供 SQL 可访问的函数。要使用它,只需将其加载到服务器中。您可以将其加载到单个会话中
LOAD 'auto_explain';
(您必须是超级用户才能执行此操作。)更典型的用法是在 postgresql.conf
中包含 auto_explain
在 session_preload_libraries 或 shared_preload_libraries 中,将其预加载到部分或所有会话中。然后,您可以跟踪意外的慢查询,无论它们何时发生。当然,这样做需要付出一定的开销。
有几个配置参数控制 auto_explain
的行为。请注意,默认行为是什么都不做,因此如果您想要任何结果,必须至少设置 auto_explain.log_min_duration
。
auto_explain.log_min_duration
(integer
) #auto_explain.log_min_duration
是语句执行的最小时间(以毫秒为单位),这将导致记录该语句的计划。将其设置为 0
将记录所有计划。-1
(默认值)禁用计划的记录。例如,如果将其设置为 250ms
,则所有运行 250 毫秒或更长时间的语句都将被记录。只有超级用户才能更改此设置。
auto_explain.log_parameter_max_length
(integer
) #auto_explain.log_parameter_max_length
控制查询参数值的记录。值 -1
(默认值)将完整记录参数值。0
禁用参数值的记录。大于零的值会将每个参数值截断为这么多字节。只有超级用户才能更改此设置。
auto_explain.log_analyze
(boolean
) #auto_explain.log_analyze
会使打印 EXPLAIN ANALYZE
输出,而不是仅打印 EXPLAIN
输出,当记录执行计划时。默认情况下,此参数处于关闭状态。只有超级用户才能更改此设置。
当此参数打开时,将为所有执行的语句执行每个计划节点的计时,无论它们是否运行足够长以实际被记录。这可能会对性能产生极其负面的影响。关闭 auto_explain.log_timing
可以缓解性能成本,但代价是获取的信息较少。
auto_explain.log_buffers
(boolean
) #auto_explain.log_buffers
控制在记录执行计划时是否打印缓冲区使用统计信息;它等效于 EXPLAIN
的 BUFFERS
选项。除非启用 auto_explain.log_analyze
,否则此参数无效。默认情况下,此参数处于关闭状态。只有超级用户才能更改此设置。
auto_explain.log_wal
(boolean
) #auto_explain.log_wal
控制在记录执行计划时是否打印 WAL 使用统计信息;它等效于 EXPLAIN
的 WAL
选项。除非启用 auto_explain.log_analyze
,否则此参数无效。默认情况下,此参数处于关闭状态。只有超级用户才能更改此设置。
auto_explain.log_timing
(boolean
) #auto_explain.log_timing
控制在记录执行计划时是否打印每个节点的计时信息;它等效于 EXPLAIN
的 TIMING
选项。在某些系统上,重复读取系统时钟的开销可能会显著减慢查询速度,因此,当只需要实际的行数,而不需要确切的时间时,将此参数设置为关闭可能很有用。除非启用 auto_explain.log_analyze
,否则此参数无效。默认情况下,此参数处于开启状态。只有超级用户才能更改此设置。
auto_explain.log_triggers
(boolean
) #auto_explain.log_triggers
会使触发器执行统计信息包含在记录执行计划时。除非启用 auto_explain.log_analyze
,否则此参数无效。默认情况下,此参数处于关闭状态。只有超级用户才能更改此设置。
auto_explain.log_verbose
(boolean
) #auto_explain.log_verbose
控制在记录执行计划时是否打印详细信息;它等效于 EXPLAIN
的 VERBOSE
选项。默认情况下,此参数处于关闭状态。只有超级用户才能更改此设置。
auto_explain.log_settings
(boolean
) #auto_explain.log_settings
控制在记录执行计划时是否打印有关修改的配置选项的信息。输出中仅包含影响查询计划且值与内置默认值不同的选项。默认情况下,此参数处于关闭状态。只有超级用户才能更改此设置。
auto_explain.log_format
(enum
) #auto_explain.log_format
选择要使用的 EXPLAIN
输出格式。允许的值为 text
、xml
、json
和 yaml
。默认值为 text。只有超级用户才能更改此设置。
auto_explain.log_level
(enum
) #auto_explain.log_level
选择 auto_explain 将在其中记录查询计划的日志级别。有效值为 DEBUG5
、DEBUG4
、DEBUG3
、DEBUG2
、DEBUG1
、INFO
、NOTICE
、WARNING
和 LOG
。默认值为 LOG
。只有超级用户才能更改此设置。
auto_explain.log_nested_statements
(boolean
) #auto_explain.log_nested_statements
会使嵌套语句(在函数内部执行的语句)被考虑用于记录。当它关闭时,仅记录顶层查询计划。默认情况下,此参数处于关闭状态。只有超级用户才能更改此设置。
auto_explain.sample_rate
(real
) #auto_explain.sample_rate
会使 auto_explain 仅解释每个会话中一部分语句。默认值为 1,表示解释所有查询。如果是嵌套语句,则要么全部解释,要么都不解释。只有超级用户才能更改此设置。
在普通用法中,这些参数在 postgresql.conf
中设置,尽管超级用户可以在他们自己的会话中动态地更改它们。典型的用法可能是
# postgresql.conf session_preload_libraries = 'auto_explain' auto_explain.log_min_duration = '3s'
postgres=# LOAD 'auto_explain'; postgres=# SET auto_explain.log_min_duration = 0; postgres=# SET auto_explain.log_analyze = true; postgres=# SELECT count(*) FROM pg_class, pg_index WHERE oid = indrelid AND indisunique;
这可能会产生如下日志输出
LOG: duration: 3.651 ms plan: Query Text: SELECT count(*) FROM pg_class, pg_index WHERE oid = indrelid AND indisunique; Aggregate (cost=16.79..16.80 rows=1 width=0) (actual time=3.626..3.627 rows=1 loops=1) -> Hash Join (cost=4.17..16.55 rows=92 width=0) (actual time=3.349..3.594 rows=92 loops=1) Hash Cond: (pg_class.oid = pg_index.indrelid) -> Seq Scan on pg_class (cost=0.00..9.55 rows=255 width=4) (actual time=0.016..0.140 rows=255 loops=1) -> Hash (cost=3.02..3.02 rows=92 width=4) (actual time=3.238..3.238 rows=92 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 4kB -> Seq Scan on pg_index (cost=0.00..3.02 rows=92 width=4) (actual time=0.008..3.187 rows=92 loops=1) Filter: indisunique
Takahiro Itagaki <[email protected]>
如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的地方,请使用此表单报告文档问题。