auto_explain
模块提供了一种方式来自动记录慢速语句的执行计划,而不需 要手工运行EXPLAIN。这在大型应用中追踪未被优化的查询时有用。
该模块没有提供 SQL 可访问的函数。要使用它,简单地将它载入服务器。你可以把它载入到一个单独的 会话:
LOAD "auto_explain";
(你必须作为超级用户来这样做)。更典型的用法是通过在postgresql.conf
的session_preload_libraries或shared_preload_libraries参数中包括
auto_explain
将它预先 载入到某些或者所有会话中。然后你就可以追踪那些出乎意料地慢的查询,而不管它们何时发生。当然为 此会付出一些额外的负荷作为代价。
有几个配置参数用来控制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_analyze
(boolean
)
当一个执行计划被记录时,auto_explain.log_analyze
导致EXPLAIN ANALYZE
输出(而不仅仅是EXPLAIN
输出)被打印。默认情况下这个参数是关闭的。只有超级用户能够改变这个设置。
当这个参数为打开时,对所有被执行的语句将引起对每个计划节点的计时,不管它们是否运行得足够长以至于被记录。这可能对性能有极度负面的影响。
auto_explain.log_buffers
(boolean
)
当一个执行计划被记录时,auto_explain.log_buffers
控制是否打印 缓冲区使用统计信息;它等效于EXPLAIN
的BUFFERS
选项。除非 auto_explain.log_analyze
参数被设置,否则这个参数没有效果。这个参数默 认情况下是关闭的。只有超级用户能够改变这个设置。
auto_explain.log_wal
(boolean
)
auto_explain.log_wal
控制当执行计划被记录时是否打印WAL使用情况统计信息; 它相当于EXPLAIN
的 WAL
选项。 除非启用了auto_explain.log_analyze
,否则这个参数不生效。 这个参数默认是关闭状态。只有超级用户能够改变这个设置。
auto_explain.log_timing
(boolean
)
当一个执行计划被记录时,auto_explain.log_timing
控制是否打印每 个结点上的计时信息;它等效于EXPLAIN
的TIMING
选项。重复读取 系统锁的开销在某些系统上可能会显著地拖慢查询,因此当只需要实际行计数而非确切时间时,关闭 这个参数将会很有帮助。只有当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_settings
(boolean
)
auto_explain.log_settings
控制执行计划被日志记录时是否打印关于已修改的配置选项的信息。输出中仅包含影响查询计划的选项,其值与内置缺省值不同。该参数默认关闭。仅超级用户可修改该设置。
auto_explain.log_format
(enum
)
auto_explain.log_format
选择要使用的EXPLAIN
输出格式。允许的值是text
、xml
、json
和yaml
。默认是文本形式。只有超级用户能够改变这个设置。
auto_explain.log_level
(enum
)
auto_explain.log_level
选择日志的级别,在此级别上,auto_explain会记录查询计划。有效值为DEBUG5
, DEBUG4
,DEBUG3
, DEBUG2
, DEBUG1
,
INFO
, NOTICE
, WARNING
和LOG
。缺省为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"
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
Takahiro Itagaki <itagaki.takahiro@oss.ntt.co.jp>
dblink_error_message — 得到在命名连接上的最后一个错误消息 大纲dblink_error_message(text connname) 返回 text 描述 dblink...
dblink_build_sql_delete — 使用所提供的主键域值构建一个 DELETE 语句大纲dblink_build_sql_delete(text relname,int2vec...
本节教程涵盖了Oracle的数据库的基础知识,其目的是帮助用户构建强大的Oracle数据库基础。在完成本节教程后,用户将能够编写复杂...
在Oracle数据库中,外键是强制实施参照完整性的一种方式,使用外键就意味着一个表中的值在另一个表中也必须出现。被引用的表称为...
SQL ORDER BY 关键字ORDER BY 关键字用于对结果集进行排序。SQL ORDER BY 关键字 ORDER BY 关键字用于对结果集按照一个列或者多...