我有一个未优化的查询,它在一天中的不同时间运行一系列不同的执行时间,从 1 分钟到 14 小时不等。 CPU 利用率、内存和数据库上的其他并发负载保持不变,什么会导致这种变化?请注意,自动真空过程在午夜运行,并且性能在早上显着提高。我的断言是,由于表碎片、死元组和大量读取,同一张表的统计信息发生变化,从而生成不同的执行计划。为了证明这个断言,我想获取当前正在运行的查询的查询计划。请注意,我不可能在执行之前简单地
EXPLAIN
查询。
在
postgresql.conf
中有两个用于预加载库的设置。第一个,shared_preload_libraries
,如果不重新启动就无法工作。但另一个 session_preload_libraries
会的。因此,编辑 postgresql.conf
以在其中添加以下行:
session_preload_libraries = 'auto_explain'
然后重新加载:
pg_ctl reload (or pg_ctlcluster 9.x main reload etc)
然后更改数据库以将其打开:
alter database smarlowe set auto_explain.log_min_duration=1;
然后所有新连接都会获得 auto_explained 计划。
将持续时间更改为对您最有意义的毫秒设置。