我需要知道特定查询将运行多长时间(我预计运行时间非常长)。为此,我决定在查询集上运行EXPLAIN ANALYZE
,只使用整个数据集的一部分并从那里进行推断。但我有一个问题;在连接超时之前,查询需要两个多小时,没有结果。我不想增加超时,因为我不知道可以运行多长时间(两小时到两天之间)。
有什么方法可以指示SQL服务器将数据输出到服务器文件系统上的文件中,所以我不必担心超时?我尝试了以下内容:
Copy (
EXPLAIN ANALYZE INSERT INTO <table>
<Long complex query here>
) To '/tmp/analyze.csv' With CSV;
但我在EXPLAIN
收到错误。
对于记录,是的,我想ANALYZE
因为
答案 0 :(得分:12)
您只需使用\o
中的psql
将结果输出到文件:
# \o /tmp/output.txt
# explain analyze ...
# \o
\o
也可以输入命令:查看this blog post,当然还有psql
documentation。
答案 1 :(得分:3)
非常简单的伎俩:
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;
请注意,如果您不想真正修改数据,那么您需要shpuld将其包装到事务中:
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.