2017-08-24 56 views
1

我有一个未优化的查询,在1分钟到14小时的不同时间运行一系列不同的执行时间。数据库上的CPU利用率,内存和其他并发负载保持不变,可能会导致这种变化?请注意,自动真空过程在午夜运行,并且性能在早上大幅度提高。我的断言是,由于表碎片,死元组和大量的读取,同一个表上的统计信息发生变化,从而产生不同的执行计划。为了证明这个断言,我想获得正在运行的当前查询的查询计划。请注意,我不可能在执行前简单地使用EXPLAIN查询。如何获得postgresql中正在运行的查询的执行计划?

+2

https://www.postgresql.org/docs/current/static/auto-explain.html –

+0

AFAIU,这将需要重新启动数据库,这也不是一个选项。此外,这对于为所有长时间运行的查询产生查询计划而不仅仅是有关的查询。 –

+1

1:这不需要重新启动,最多只能重新加载。 2:PostgreSQL必须为每个查询生成查询计划(除非它已经准备好了,否则它只会制定一次计划)。 3:这里唯一的开销是记录最小的查询计划。只需将auto_explain.log_min_duration设置为10000即可,因此它必须是10秒查询等。 –

回答

1

等我找到了它。在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; 

然后所有新的连接可以获得自动解释的计划。

将持续时间更改为最适合您的毫秒设置。