开启方式
1、通过配置文件postgresql.conf
shared_preload_libraries = 'auto_explain'
auto_explain.log_min_duration = 0 # 为了方便查看,这里把时间设置为0,所有SQL都会被auto_explain捕获输出.实际使用的时候适当调大。如 100ms auto_explain.log_analyze = true # 以下可选 auto_explain.log_verbose = true auto_explain.log_buffers = true auto_explain.log_nested_statements = true
需要重启数据库,重启时会输出一个LOG
postgres@db5-> LOG: loaded library "$libdir/auto_explain.so"
2、通过LOAD 'auto_explain';
只在当前session生效,不需要重启数据库,需要超级用户权限
普通用户不允许加载auto_explain模块(普通用户只允许加载$libdir/plugins目录下的模块,但是auto_explain即使拷贝到这个目录也不行)
也可以设置local_preload_libraries,session_preload_libraries参数来启用
配置参数介绍及示例
配置参数控制着auto_explain的行为。需要注意的是,默认情况下的行为是什么也不做,所以如果想要得到相关结果,必须至少要设置auto_explain.log_min_duration这个参数。注意,只有数据库超级用户才能设置以下参数。
1)auto_explain.log_min_duration(integer)
这个参数指的是最小语句执行时间,单位是毫秒,设置之后语句计划就会被记录。例如,设置此参数的值为250毫秒,那么运行时间在250毫秒及以上的语句会被记录下来。默认值为-1,表示不记录任何计划。
如果将此参数设置为0,表示记录所有的计划。
2)auto_explain.log_analyze(boolean)
设置这个参数使得当一个执行计划被记录时,会让EXPLAIN ANALYZE的结果,而不仅仅是EXPLAIN 的结果被打印出来。默认值为off。
将此参数设置为on之后,就能获得EXPLAIN ANALYZE的结果。
注意,将这个参数设置为on可能会对性能造成极大的不良影响,所以为了优化性能成本可以将它设置为off,代价是获得的信息会少一些。
3)auto_explain.log_buffers(boolean)
此参数控制着当一个执行计划被记录时,缓冲区用量统计信息是否被打印出来。这个参数只有当开启auto_explain.log_analyze后才有作用,默认为off。
4)auto_explain.log_timing(boolean)
此参数控制着当一个执行计划被记录时,是否每个节点的时间信息都被打印出来。这个参数只有当开启auto_explain.log_analyze后才有作用,默认值为on。
需要注意的是,在有些系统中重复读取系统时钟的开销会显著地降低查询速率。所以如果我们只想得到实际的行数信息,而不是精确的时间信息的话,建议将此参数设置为off
5)auto_explain.log_triggers(boolean)
此参数使得当一个执行计划被记录时,触发器的执行统计信息也会被包含进去。这个参数只有当开启auto_explain.log_analyze后才有作用,默认值为off。
6)auto_explain.log_verbose(boolean)
此参数控制着当执行计划被记录时,是否打印细节信息。默认值为off。
7)auto_explain.log_format(enum)
设置这个参数可以选择要使用的EXPLAIN输出格式。默认为text格式,可选的格式有:text,xml,json 和yaml格式。
8)auto_explain.log_nested_statements
设置此参数可以让嵌套语句被记录下来。默认值为off,表示只有顶层查询会被记录。
9)auto_explain.sample_rate使auto_explain
设置此参数可以使auto_explain只解释每个会话中的一部分语句。默认值为1,表示解释所有的查询。