Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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

F.3.1. 配置参数
F.3.2. 示例
F.3.3. 作者

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

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

LOAD 'auto_explain';

(你需要是超级用户才能执行此操作。) 更典型的用法是通过在 session_preload_librariesshared_preload_libraries 中包含 auto_explain,将其预加载到某些或所有会话中。postgresql.conf。然后,你可以随时跟踪意外缓慢的查询。当然,这需要付出一点代价。

F.3.1. 配置参数 #

有几个配置参数控制 auto_explain 的行为。请注意,默认行为是不执行任何操作,所以如果你想要任何结果,则必须至少设置 auto_explain.log_min_duration

auto_explain.log_min_duration (integer) #

auto_explain.log_min_duration 是语句执行的最小时间(以毫秒为单位),超过此时间将记录语句的计划。将其设置为 0 会记录所有计划。-1(默认值)禁用计划记录。例如,如果你将其设置为 250ms,则运行时间为 250ms 或更长时间的所有语句都将被记录。只有超级用户才能更改此设置。

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 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.3.3. 撰写者 #

Takahiro Itagaki