Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在postgresql中获取运行查询的执行计划?_Postgresql - Fatal编程技术网

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

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

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

等等,我让它工作了。在postgresql.conf中,有两个用于预加载库的设置。第一个是shared_preload_库,如果不重新启动,它将无法工作。但另一个会话将预加载库。因此,编辑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;
然后所有的新连接都会自动连接


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

AFAIU,这将需要重新启动数据库,而这也不是一个选项。此外,这还需要为所有长时间运行的查询生成查询计划,而不仅仅是相关的查询。1:这不需要重新启动,最多需要重新加载。2:无论如何,PostgreSQL必须为每个查询生成查询计划(除非它准备好了,否则它只生成一次计划)。3:这里唯一的开销是记录查询计划,这是最小的。只需将auto_explain.log_min_duration设置为simethung,比如10000,这样它就必须是一个10秒的查询等。注意,您可以加载扩展,设置auto_explain.log_min_duration,直到错误查询过去,然后将其设置回-1以关闭它。@Scottmarlove确实,您不需要重新启动是正确的。但如何将其应用于所有会话。这不需要重启吗?