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

问题描述 投票:0回答:1

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

EXPLAIN
查询。

postgresql
1个回答
3
投票

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 计划。

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

© www.soinside.com 2019 - 2024. All rights reserved.