On this page
F.4. auto_explain
auto_explain
模块提供了一种自动记录慢速语句执行计划的方法,而无需手动运行EXPLAIN。这对于跟踪大型应用程序中未优化的查询特别有用。
该模块不提供 SQL 可访问的功能。要使用它,只需将其加载到服务器中。您可以将其加载到单个会话中:
LOAD 'auto_explain';
(您必须是超级用户才能这样做.)更典型的用法是通过在session_preload_libraries中包含auto_explain
或在postgresql.conf
中包含shared_preload_libraries来将其预加载到部分或所有会话中。然后,无论何时发生,您都可以跟踪异常缓慢的查询。当然,这样做的开销很大。
F.4.1. 配置参数
有几个配置参数可控制auto_explain
的行为。请注意,默认行为是不执行任何操作,因此,如果要获得任何结果,则必须至少设置auto_explain.log_min_duration
。
auto_explain.log_min_duration
(integer
)auto_explain.log_min_duration
是最短的语句执行时间(以毫秒为单位),它将导致记录语句的计划。将此设置为零将记录所有计划。减一(默认)禁用计划记录。例如,如果将其设置为250ms
,则将记录所有运行 250ms 或更长时间的语句。只有超级用户可以更改此设置。
auto_explain.log_analyze
(boolean
)- 记录执行计划时,
auto_explain.log_analyze
将导致打印EXPLAIN ANALYZE
输出而不是EXPLAIN
输出。默认情况下,此参数是关闭的。只有超级用户可以更改此设置。
- 记录执行计划时,
Note
启用此参数后,所有计划执行的语句都会按计划节点计时,无论这些语句运行的时间是否足够长以至于无法 true 记录下来。这可能会对性能产生极大的负面影响。关闭auto_explain.log_timing
可以降低性能成本,但代价是获取更少的信息。
auto_explain.log_buffers
(boolean
)auto_explain.log_buffers
控制在记录执行计划时是否打印缓冲区使用情况统计信息;它等效于EXPLAIN
的BUFFERS
选项。除非启用auto_explain.log_analyze
,否则此参数无效。默认情况下,此参数是关闭的。只有超级用户可以更改此设置。
auto_explain.log_timing
(boolean
)auto_explain.log_timing
控制在记录执行计划时是否打印每个节点的计时信息;它等效于EXPLAIN
的TIMING
选项。重复读取系统时钟的开销可能会严重降低某些系统上的查询速度,因此在仅需要实际行计数而不是确切时间的情况下将此参数设置为 off 可能很有用。除非启用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_format
(enum
)auto_explain.log_format
选择要使用的EXPLAIN
输出格式。允许的值为text
,xml
,json
和yaml
。默认为文本。只有超级用户可以更改此设置。
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.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
板垣孝宏<itagaki.takahiro@oss.ntt.co.jp>