2016-04-11 10 views
4

Belirli bir sorgunun ne kadar süreceğini bilmeliyim (çok uzun bir çalışma süresi bekliyorum). Bunu yapmak için, sorgu kümesinde yalnızca tüm veri kümesinin bir parçasıyla bir EXPLAIN ANALYZE çalıştırmaya karar verdim ve oradan çıkartacağım. Ama benim bir problemim var; Sorgu, bağlantı zaman aşımına uğramadan iki saatten fazla sürüyor ve sonuç bırakmıyor. Zaman aşımını artırmak istemiyorum çünkü ne kadar uzun süre çalışacağını bilmiyorum (iki saat ile iki gün arasında).Postgresql çıkışı EXPLAIN ANALYZE dosyası için

SQL sunucusunu, sunucunun dosya sistemindeki bir dosyaya veri çıkışı için yönlendirebilmem için herhangi bir yol var mı, bu nedenle zaman aşımları hakkında endişelenmenize gerek yok mu?

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

ama EXPLAIN de bir hata alıyorum: Aşağıdaki denedim. Kayıt için

, evet daha sonra işlemek için veri miktarını azaltır ANALYZE
  • çünkü yapmak istiyorum ve
  • gerçek bir süre tahmininde verir.

cevap

3

çok basit hile:

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; 

dikkat edin, eğer gerçekten sonra verileri her işlem haline sarmak için shpuld değiştirmek istemiyorsanız:

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

Muhtemelen kullanıma hazır benzer işlev zaten var ama ben onu bulamadım.

Not: Bu sözdizimi hatasıyla sorunu çözmek ama belgelerinde belirtildiği, çünkü zaman aşımı sorunu çözer ben emin olmaz:

Önemli: deyim aslında unutmayın ANALİZ seçeneği kullanıldığında yürütülür. Link.

+0

Teşekkürler! Bu tam ihtiyacım olan şeyi yapıyor gibi görünüyor. Sorgunun daha sonra yapmak için daha az anlamına geldiğinden gerçekten yürütmesini istiyorum. Ayrıca, bağlantı zaman aşımına uğradıktan sonra sorgunun devam ettiğini biliyorum, bu yüzden açıklamanın iptal edilmesinden endişelenmiyorum. Sorun bitecek ve bağlantı kapatılacaktı, böylece sonucu hiç görmedim. Bir dosyaya yazmak daha sonra tekrar kontrol edebileceğim anlamına geliyor. – user2752635

8

Sadece bir dosyaya çıktı sonuçlarına psql içinde \o kullanabilirsiniz:

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

\o da boru bir komuta edebilirsiniz

: this blog post ve tabii psql documentation dışarı atın.

+1

Ayrıca, EXPLAIN (ANALYZE, FORMAT json) ile dosyaya JSON formatında yazabilirsiniz. – seb