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

Note

启用此参数后,所有计划执行的语句都会按计划节点计时,无论这些语句运行的时间是否足够长以至于无法 true 记录下来。这可能会对性能产生极大的负面影响。关闭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

板垣孝宏<itagaki.takahiro@oss.ntt.co.jp>

上一章 首页 下一章