2016-04-11 12 views
4

Ich muss wissen, wie lange eine bestimmte Abfrage ausgeführt wird (ich erwarte eine sehr lange Laufzeit). Um dies zu tun, habe ich beschlossen, eine EXPLAIN ANALYZE auf die Abfrage mit nur einem Teil des gesamten Datensatzes ausführen und von dort extrapolieren. Aber ich habe ein Problem; Die Abfrage dauert mehr als zwei Stunden, bevor die Verbindung abläuft, was zu keinen Ergebnissen führt. Ich möchte das Timeout nicht erhöhen, weil ich nicht weiß, wie lange es dauern könnte (es liegt zwischen zwei Stunden und zwei Tagen).Postgresql Ausgabe EXPLAIN ANALYSE in Datei

Gibt es eine Möglichkeit, den SQL-Server zu veranlassen, die Daten in eine Datei auf dem Dateisystem des Servers auszugeben, so dass ich mich nicht um Timeouts kümmern muss? Ich habe folgendes versucht:

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

aber ich erhalte eine Fehlermeldung bei EXPLAIN.

Für das Protokoll, ja, ich will ANALYZE weil

  • es um die Datenmenge tun, verringert später zu verarbeiten und
  • es gibt eine tatsächliche Zeitschätzung.

Antwort

3

Die sehr einfachen Trick:

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; 

Beachten Sie, dass, wenn Sie nicht wirklich wollen, um die Daten zu ändern, dann shpuld Sie es in die Transaktion zu wickeln:

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

Wahrscheinlich die bereit, ähnliche Funktion zu verwenden, existiert bereits, aber ich habe es nicht gefunden.

PS: Es wird das Problem mit Syntaxfehlern lösen, aber ich sicher nicht, dass es das Timeout Problem löst, denn wie in der Dokumentation erwähnt:

Wichtige: Beachten Sie, dass die Aussage tatsächlich ist Wird ausgeführt, wenn die Option ANALYSE verwendet wird. Link.

+0

Danke! Das scheint genau das zu tun, was ich brauchte. Ich möchte, dass die Abfrage tatsächlich ausgeführt wird, da es später weniger bedeutet. Außerdem weiß ich, dass die Abfrage nach Ablauf der Verbindung weiterhin ausgeführt wird, sodass ich mir keine Sorgen darüber mache, dass die Erklärung abgebrochen wird. Das Problem war, dass es zu Ende ging und die Verbindung geschlossen wurde, so dass ich das Ergebnis nie sah. Wenn ich in eine Datei schreibe, kann ich später nachsehen. – user2752635

8

Sie können einfach \o in psql zu Ausgabeergebnisse in eine Datei verwenden:

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

\o kann auch über die Pipeline auf einen Befehl: die psql documentationthis blog post und natürlich überprüfen.

+1

Sie können im JSON-Format auch mit EXPLAIN (ANALYSE, FORMAT json) in eine Datei schreiben – seb

Verwandte Themen