2015-05-30 18 views
5

Postgresql'deki sorgu optimizasyonunu anlamaya çalışıyorum ve içinde bazı sorgular içeren bir işlev var. Bazıları bir değişkene bir değer kazandırır basit sorgular da vardır ve ardından bir sonraki sorgu şey bulmak için bu değişkeni alır .. Diyelim:postgreSQL, bir işlevi analiz etmeyi açıklar

function()... 
select type into t 
from tableA 
where code = a_c; 

select num into n 
from tableB 
where id = t; 
end function... 

ve .. daha birçok Ben bütün fonksiyonunu analiz açıklamak istiyorum Komutu çalıştır komut analizini açıkla işlevini(); Bunu yapmak için doğru yol mu, yoksa fonksiyon içindeki her sorguyu analiz etmem mi gerekiyor? auto_explain.log_nested_statements ile

The auto_explain module provides a means for logging execution plans of slow statements automatically, without having to run EXPLAIN by hand. This is especially helpful for tracking down un-optimized queries in large applications.

açık:

+0

, belirli bir sorgu olmadığını görmek mümkün olacaktır optimize edilebilir. İşlev seviyesinde nasıl çalıştığından ve mantıklı olup olmadığından emin değil. – Ashalynd

+2

İşlev gövdesini bir “HAZIRLIK şeyine (arg1, arg2, ...) AS ... orijinal bedenine koyabilirsiniz ... 've bunu kullanarak analiz et komutunu çalıştırınız (args);' – wildplasser

+0

@wildplasser vücuttaki beyan bildirimleriyle ilgili bir hata var ve bunları bildirmezsem bu hatayı alıyorum: yardımcı bildiriler hazır olamaz –

cevap

4

auto_explain modülü kullanarak düşünün her birey sorgusu için "analiz açıklamak" yoksa

auto_explain.log_nested_statements (boolean)

auto_explain.log_nested_statements causes nested statements (statements executed inside a function) to be considered for logging. When it is off, only top-level query plans are logged. This parameter is off by default. Only superusers can change this setting.

+0

Bunu yapmayı denedim ama elde ettiğim çıktı, fonksiyonun geri döndüğü şey. Kullandığım kod: LOAD 'auto_explain'; SET auto_explain.log_min_duration = 0; SET auto_explain.log_analyze = true; SET auto_explain.log_nested_statements = açık; find_4() öğesini seçin; –

+0

Bu modül tarafından yapılan 'açıklama' sonuçları, sunucunun günlüğüne gider, aldığınız çıktıyı değiştirmez. –

+0

Çalışmıyor. – Pencilcheck