Postgresql 中文操作指南
F.4. auto_explain — log execution plans of slow queries #
auto_explain 模块提供了一种方法,用于自动记录慢语句的执行计划,而无需手动运行 EXPLAIN 。这对于追踪大型应用程序中未经优化的查询特别有帮助。
该模块不提供 SQL 可访问函数。要使用它,只需将其加载到服务器中即可。可以将其加载到单个会话中:
LOAD 'auto_explain';
(您必须是超级用户才能这样做)。更典型的用法是,通过在 session_preload_libraries 中包含 auto_explain 或在 postgresql.conf 中包含 shared_preload_libraries,将其预加载到某些或所有会话中。然后,无论何时发生意外的慢查询,您都可以对其进行跟踪。当然,这样会有开销的代价。
F.4.1. Configuration Parameters #
有几个配置参数控制 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_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。默认值为文本。只有超级用户才能更改此设置。
-
-
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,表示解释所有查询。对于嵌套语句,要么解释所有语句,要么都不解释。只有超级用户才能更改此设置。
-
Note
当此参数打开时,对于所有执行的语句都会发生逐计划节点计时,无论其是否运行得足够长以真正获取日志。这可能会对性能产生极大的负面影响。关闭 auto_explain.log_timing 会减轻性能损失,但代价是获取更少的信息。
在普通用法中,这些参数是在 postgresql.conf 中设置的,尽管超级用户可以在其自己的会话中即时更改它们。典型用法可能是:
# postgresql.conf
session_preload_libraries = 'auto_explain'
auto_explain.log_min_duration = '3s'
F.4.2. Example #
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
F.4.3. Author #
Takahiro Itagaki < link:mailto:itagaki.takahiro@oss.ntt.co.jp[itagaki.takahiro@oss.ntt.co.jp]>