PostgreSQL输出EXPLAIN ANALYZE到文件

klsxnrf1  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(3)|浏览(161)

我需要知道一个特定的查询将运行多长时间(我预计运行时间很长)。为此,我决定在查询集上运行EXPLAIN ANALYZE,其中只包含整个数据集的一部分,并从那里进行推断。但我有个问题;在连接超时之前,查询需要两个多小时,使我没有结果。我不想增加超时时间,因为我不知道可能运行多长时间(在两小时到两天之间)。
有没有什么方法可以让SQL服务器将数据输出到服务器文件系统上的一个文件中,这样我就不必担心超时了?我尝试了以下方法:

Copy (
    EXPLAIN ANALYZE INSERT INTO <table>
    <Long complex query here>
) To '/tmp/analyze.csv' With CSV;

字符串
但是我在EXPLAIN处得到了一个错误。
为了记录,是的,我想做ANALYZE,因为

  • 它减少了以后要处理的数据量,并且
  • 它给出实际时间估计。
0yg35tkg

0yg35tkg1#

您可以简单地在psql中使用\o将结果输出到文件中:

# \o /tmp/output.txt
# explain analyze ...
# \o

字符串
\o也可以通过管道传输到命令:查看this blog post,当然还有psql documentation

m2xkgtsf

m2xkgtsf2#

非常简单的技巧:

create or replace function get_explain(in qry text, out r text) returns setof text as $$
begin
  for r in execute qry loop
    raise info '%', r;
    return next;
  end loop;
  return;
end; $$ language plpgsql;

字符串
请注意,如果您不想真正修改数据,则应将其 Package 到事务中:

begin;
copy (select get_explain('explain (analyze) select 1;')) to '/tmp/foo.foo';
select get_explain('explain (analyze, format xml) select 1;');
rollback;


可能准备使用类似的功能已经存在,但我没有找到它。
PS:它将解决语法错误的问题,但我不确定它是否解决了超时问题,因为如文档中所述:

重要:请记住,使用ANALYZE选项时实际执行该语句。Link.

2w3rbyxf

2w3rbyxf3#

您也可以使用JSON格式写入文件:

EXPLAIN (ANALYZE, FORMAT JSON)

字符串
(All信用到@seb,我主要在这里回答,这样我就可以书签他们的回答)

相关问题