2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4

F.3. auto_explain — 记录慢查询的执行计划 #

auto_explain 模块提供了一种自动记录慢语句执行计划的方法,而无需手动运行 EXPLAIN。这对于跟踪大型应用程序中未优化的查询非常有帮助。

该模块不提供 SQL 可访问的函数。要使用它,只需将其加载到服务器中。您可以将其加载到单个会话中

LOAD 'auto_explain';

(您必须是超级用户才能执行此操作。) 更常见的用法是通过在 postgresql.conf 中将 auto_explain 包含在 session_preload_librariesshared_preload_libraries 中,将其预加载到部分或所有会话中。然后,您可以跟踪任何时候发生的意外慢查询。当然,这会带来额外的开销。

F.3.1. 配置参数 #

有几个配置参数控制着 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 控制在记录执行计划时是否打印缓冲区使用统计信息;这相当于 EXPLAINBUFFERS 选项。此参数仅在 auto_explain.log_analyze 启用时才有效。此参数默认关闭。只有超级用户才能更改此设置。

auto_explain.log_wal (boolean) #

auto_explain.log_wal 控制在记录执行计划时是否打印 WAL 使用统计信息;这相当于 EXPLAINWAL 选项。此参数仅在 auto_explain.log_analyze 启用时才有效。此参数默认关闭。只有超级用户才能更改此设置。

auto_explain.log_timing (boolean) #

auto_explain.log_timing 控制在记录执行计划时是否打印每个节点的计时信息;这相当于 EXPLAINTIMING 选项。在某些系统上,重复读取系统时钟的开销会显著减慢查询速度,因此在只需要实际行数而不关心精确时间时,将此参数设置为关闭可能很有用。此参数仅在 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 控制在记录执行计划时是否打印详细信息;这相当于 EXPLAINVERBOSE 选项。此参数默认关闭。只有超级用户才能更改此设置。

auto_explain.log_settings (boolean) #

auto_explain.log_settings 控制在记录执行计划时是否打印有关已修改配置选项的信息。输出中仅包含影响查询计划且其值与内置默认值不同的选项。此参数默认关闭。只有超级用户才能更改此设置。

auto_explain.log_format (enum) #

auto_explain.log_format 选择要使用的 EXPLAIN 输出格式。允许的值为 textxmljsonyaml。默认是 text。只有超级用户才能更改此设置。

auto_explain.log_level (enum) #

auto_explain.log_level 选择 auto_explain 将用于记录查询计划的日志级别。有效值为 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGLOG。默认值是 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'

F.3.2. 示例 #

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.00 loops=1)
    ->  Hash Join  (cost=4.17..16.55 rows=92 width=0) (actual time=3.349..3.594 rows=92.00 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.00 loops=1)
          ->  Hash  (cost=3.02..3.02 rows=92 width=4) (actual time=3.238..3.238 rows=92.00 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.00 loops=1)
                      Filter: indisunique

F.3.3. 作者 #

Takahiro Itagaki

提交更正

如果您在文档中发现任何不正确的内容、与您使用该功能的实际情况不符或需要进一步说明的内容,请使用 此表单 报告文档问题。