2016-04-11 19 views
4

特定のクエリが実行される時間を知る必要があります(非常に長い実行時間が必要です)。これを行うために、私はデータセット全体の一部のみを含むクエリセットに対してEXPLAIN ANALYZEを実行し、そこから外挿することにしました。しかし、私には問題があります。接続がタイムアウトするまでに2時間以上かかるので、結果は表示されません。私はどれくらいの時間(2時間と2日の間)か分からないので、タイムアウトを増やしたくありません。Postgresqlの出力EXPLAIN ANALYZE to file

サーバーのファイルシステム上のファイルにデータを出力するようにSQLサーバーに指示する方法はありますか?タイムアウトについて心配する必要はありませんか?

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

が、私はEXPLAINでエラーが発生します。私は、次のことを試してみました。レコードの

  • ので、はい、私はANALYZEをしたい、それは後で処理するデータの量を減らし、かつ
  • それは実際の時間の推定を与えます。

答えて

3

非常に単純なトリック:あなたは本当にデータを変更したくない場合は、トランザクションにそれをラップするshpuldこと

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:それは構文エラーの問題を解決しますが、マニュアルに述べたようにので、それは、タイムアウト問題を解決することを私は確信していない:

重要:文が実際にあることに留意してくださいANALYZEオプションが使用されているときに実行されます。 Link.

+0

ありがとうございます!それはまさに私が必要としていることをするようです。クエリを実際に実行したいのは、後で行うことが少なくて済むからです。また、私は、クエリが接続タイムアウト後に実行され続けることを知っているので、私は説明がキャンセルされることを心配していません。問題は終了し、接続が閉じられて結果を見たことはありませんでした。ファイルに書き込むということは、私が後で確認できることを意味します。 – user2752635

8

あなたは、単にファイルへの出力結果にpsql\oを使用することができます。

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

\oは、コマンドにパイプすることができます:this blog postをチェックアウトし、もちろんpsql documentation

+1

また、 'EXPLAIN(ANALYZE、FORMAT json)'でJSON形式でファイルに書き込むこともできます。 – seb

関連する問題