EXPLAIN ANALYZE, bir plpgsql işlevi içindeki sorgular için hiçbir ayrıntı göstermez


18

İçinde birkaç karmaşık sorguları ile PostgreSQL 9.3 PL / pgSQL işlevini kullanıyorum:

create function f1()
  returns integer as
$$
declare

event tablename%ROWTYPE;
....
....

begin

FOR event IN
   SELECT * FROM tablename WHERE condition
LOOP
   EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return;
END LOOP;

...

INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN c WHERE ...

UPDATE T SET cl1 = M.cl1 FROM M WHERE M.pkcols = T.pkcols;

...

end
$$ language plpgsql;

Eğer koştuysam EXPLAIN ANALYZE f1(), sadece toplam süreyi alıyorum, ama detay yok. İşlevdeki tüm sorgular için ayrıntılı sonuçlar almamın bir yolu var mı?

İşlevdeki sorguların Postgres tarafından optimize edilmemesi gerekiyorsa, bir açıklama da isterim.


2
auto_explain.log_nested_statementsyardımcı olabilir. Bkz. Postgresql.org/docs/9.3/static/auto-explain.html
Daniel Vérité

Yanıtlar:


15

İlk olarak, EXPLAINçağrı için doğru sözdizimi için a gerekir SELECT. SQL'de çıplak işlev adını yazamazsınız:

EXPLAIN ANALYZE SELECT f1();

Optimizasyon

PL / pgSQL işlevleri , sorgu planlayıcısının kara kutulardır . Sorgular içeride olan sadece diğer sorgular gibi, ama optimize ayrı ve hazırlanan ekstreler gibi tek tek ve yürütme planı oturum süresince önbelleğe alınmış olabilir. Detaylar:

EXPLAIN fonksiyon organları

@Daniel'in zaten yorumladığı gibi, ek modülü kullanabilirsiniz daha fazla ayrıntı ( çok fazla ayrıntı)almak için auto_explain. Plpgsql işlevleri içindeki ifadeler "iç içe ifadeler" olarak kabul edilir. Ayarladığınızdan emin olun

SET auto_explain.log_nested_statements = ON

Detaylı talimatlar:

Kuralın bir istisnası olarak, çok basit SQL fonksiyonları (plpgsql değil) "inline" olabilir, yani fonksiyon kodu dış sorguya eklenir ve her şey başlayacak bir fonksiyon yokmuş gibi yürütülür. Sorgu planı, bu gibi durumlarda ayrıntılı bilgi içerir.


Aşağıdaki gibi 'auto_explain' özelliğini etkinleştirdikten sonra 'auto_explain' yükleyin; auto_explain.log_min_duration = 0 olarak ayarlayın; auto_explain.log_nested_statements = AÇIK olarak ayarlayın; SET auto_explain.log_analyze = doğru; Günlük dosyasında msg'nin altına geliyorum, '2014-12-08 18:21:59 IST LOG: istemciden veri alınamadı: Hedef makine aktif olarak reddettiği için bağlantı kurulamadı' kimse bana ne yol gösterebilir? asıl sorun ....
skumar

Not: Plpgsql fonksiyonunu çalıştırdıktan sonra sadece günlük dosyasında msj'nin üzerine çıkıyorum.
skumar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.