## F.4.自动的\_解释 [F.4.1.配置参数](auto-explain.html#id-1.11.7.13.5)[F.4.2.实例](auto-explain.html#id-1.11.7.13.6)[F.4.3.著者](auto-explain.html#id-1.11.7.13.7) [](<>) 这个`自动解释`模块提供了一种自动记录慢语句执行计划的方法,无需运行[解释](sql-explain.html)手工这对于跟踪大型应用程序中未优化的查询尤其有用。 该模块不提供SQL可访问的函数。要使用它,只需将其加载到服务器中即可。您可以将其加载到单个会话中: ``` LOAD 'auto_explain'; ``` (你必须是超级用户才能这么做。)更典型的用法是通过包括`自动解释`在里面[一场\_预加载\_图书馆](runtime-config-client.html#GUC-SESSION-PRELOAD-LIBRARIES)或[共享\_预加载\_图书馆](runtime-config-client.html#GUC-SHARED-PRELOAD-LIBRARIES)在里面`postgresql。形态`。然后,无论何时发生,您都可以跟踪异常缓慢的查询。当然,这在管理费用中是有代价的。 ### F.4.1.配置参数 有几个配置参数可以控制`自动解释`。请注意,默认行为是什么都不做,因此必须至少设置`自动解释。日志最短持续时间`如果你想要任何结果。 `自动解释。日志最短持续时间` (`整数`) [](<>) `自动解释。日志最短持续时间`是导致记录语句计划的最短语句执行时间(以毫秒为单位)。将此设置为`0`记录所有计划。`-1`(默认设置)禁用计划的日志记录。例如,如果将其设置为`250毫秒`然后将记录所有运行250ms或更长时间的语句。只有超级用户才能更改此设置。 `自动解释。日志分析` (`布尔值`) [](<>) `自动解释。日志分析`原因`解释分析`输出,而不仅仅是`解释`输出,在记录执行计划时打印。默认情况下,此参数处于关闭状态。只有超级用户才能更改此设置。 ### 笔记 启用此参数后,所有执行的语句都会按计划节点计时,无论它们是否运行足够长的时间以实际记录。这可能会对性能产生极其负面的影响。关掉`自动解释。对数计时`以获取较少信息为代价,改善了性能成本。 `自动解释。日志缓冲区` (`布尔值`) [](<>) `自动解释。日志缓冲区`控制记录执行计划时是否打印缓冲区使用统计信息;这相当于`缓冲区`选择`解释`。除非`自动解释。日志分析`已启用。默认情况下,此参数处于关闭状态。只有超级用户才能更改此设置。 `自动解释。原木` (`布尔值`) [](<>) `自动解释。原木`控制记录执行计划时是否打印WAL使用统计信息;这相当于`沃尔`选择`解释`。除非`自动解释。日志分析`已启用。默认情况下,此参数处于关闭状态。只有超级用户才能更改此设置。 `自动解释。对数计时` (`布尔值`) [](<>) `自动解释。对数计时`控制在记录执行计划时是否打印每个节点的定时信息;这相当于`时机`选择`解释`。重复读取系统时钟的开销会显著降低某些系统上的查询速度,因此,当只需要实际行计数而不需要精确时间时,将此参数设置为off可能会很有用。除非`自动解释。日志分析`已启用。默认情况下,此参数处于启用状态。只有超级用户才能更改此设置。 `自动解释。日志触发器` (`布尔值`) [](<>) `自动解释。日志触发器`导致在记录执行计划时包含触发器执行统计信息。除非`自动解释。日志分析`已启用。默认情况下,此参数处于关闭状态。只有超级用户才能更改此设置。 `自动解释。详细记录` (`布尔值`) [](<>) `自动解释。详细记录`控制记录执行计划时是否打印详细信息;这相当于`冗长的`选择`解释`。默认情况下,此参数处于关闭状态。只有超级用户才能更改此设置。 `自动解释。日志设置` (`布尔值`) [](<>) `自动解释。日志设置`控制在记录执行计划时是否打印有关修改的配置选项的信息。输出中只包括影响查询计划的选项,这些选项的值与内置默认值不同。默认情况下,此参数处于关闭状态。只有超级用户才能更改此设置。 `自动解释。日志格式` (`枚举`) [](<>) `自动解释。日志格式`选择`解释`要使用的输出格式。允许的值为`文本`, `xml`, `json`和`亚马尔`.默认为文本。只有超级用户才能更改此设置。 `自动解释。对数级` (`枚举`) [](<>) `自动解释。对数级`选择自动运行的日志级别\_explain将记录查询计划。有效值为`调试5`, `调试4`, `调试3`, `调试2`, `调试1`, `信息`, `注意`, `警告`和`日志`.默认值为`日志`。只有超级用户才能更改此设置。 `自动解释。日志嵌套语句` (`布尔值`) [](<>) `自动解释。日志嵌套语句`使嵌套语句(在函数内执行的语句)被考虑用于日志记录。禁用时,只记录顶级查询计划。默认情况下,此参数处于关闭状态。只有超级用户才能更改此设置。 `自动解释。抽样率` (`真实的`) [](<>) `自动解释。抽样率`导致自动\_只解释每节课中的一小部分陈述。默认值为1,表示解释所有查询。在嵌套语句的情况下,要么解释所有语句,要么不解释任何语句。只有超级用户才能更改此设置。 通常情况下,这些参数在`postgresql。形态`,尽管超级用户可以在自己的会话中动态更改它们。典型用法可能是: ``` # postgresql.conf session_preload_libraries = 'auto_explain' auto_explain.log_min_duration = '3s' ``` ### F.4.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.4.3.作者 板垣隆弘`<[itagaki。takahiro@oss.ntt.co.jp](mailto:itagaki。takahiro@oss.ntt.co.jp)>`