如何在postgresql中获取正在运行的查询的执行计划?

时间:2017-08-24 13:11:28

标签: postgresql

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

1 个答案:

答案 0 :(得分: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;

然后所有新连接都获得auto_explained计划。

将持续时间更改为对您最有意义的毫秒设置。