【问题标题】:Postgresql output EXPLAIN ANALYZE to filePostgresql 输出解释分析到文件
【发布时间】:2016-08-02 04:35:28
【问题描述】:

我需要知道特定查询将运行多长时间(我预计运行时间会很长)。为此,我决定在查询集上运行EXPLAIN ANALYZE,仅使用整个数据集的一部分并从那里推断。但我有一个问题;在连接超时之前查询需要两个多小时,让我没有结果。我不想增加超时,因为我不知道可能会运行多长时间(在两小时到两天之间)。

有什么方法可以指示 SQL 服务器将数据输出到服务器文件系统上的文件中,这样我就不必担心超时了?我尝试了以下方法:

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

但我在EXPLAIN 收到错误消息。

为了记录,是的,我想做ANALYZE,因为

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

【问题讨论】:

    标签: postgresql file output explain


    【解决方案1】:

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

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

    \o 也可以通过管道传递给命令:查看this blog post,当然还有psql documentation

    【讨论】:

    • 你也可以用EXPLAIN (ANALYZE, FORMAT json)写成JSON格式的文件
    • 我在任何地方都找不到这个文档(如何结合 ANALYZE 和 FORMAT)。
    • 对于其他人来说,这里是the docs for these options
    【解决方案2】:

    非常简单的技巧:

    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;
    

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

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

    可能已经有类似功能的即用型了,但我没有找到。

    PS:它会解决语法错误的问题,但我不确定它是否解决了超时问题,因为如文档中所述:

    重要提示:请记住,该语句实际上是在何时执行的 使用分析选项。 Link.

    【讨论】:

    • 谢谢!这似乎正是我所需要的。我确实希望查询能够真正执行,因为这意味着以后要做的事情更少。另外,我知道连接超时后查询会继续运行,所以我不担心解释会被取消。问题是它会完成并且连接会关闭,所以我从来没有看到结果。写入文件意味着我可以稍后再查看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2012-07-23
    • 2018-01-17
    • 1970-01-01
    • 2021-03-17
    • 2013-07-03
    相关资源
    最近更新 更多