PostgreSQL sorgusunu nasıl karşılaştırabilirim?


34

PostgreSQL için yazdığım kullanıcı tanımlı bir işlevi içeren bir sorguyu kıyaslamak istiyorum. Böyle bir kıyaslama yapmanın standart yolları var mı?

\timingPsql komut isteminde zamanlamanın açılabileceğini biliyorum , ancak ideal olarak her şeyi otomatik olarak yapan bir betiğe sahip olmak istiyorum: sorguyu birkaç kez çalıştırmak, her çalıştırmadan sonra PostgreSQL önbelleğini temizlemek (muhtemelen PostgreSQL’leri yeniden başlatmak suretiyle) servis) ve ortalama çalışma süresinin çıkarılması (ve kullanılan hafıza bir artıdır).


3
Kontrol edin pgbench; ne istediğinizi yapmak için özel komut dosyaları ile çalıştırabilirsiniz. Pg'yi durdurup yeniden başlatmak ve işletim sistemi disk önbelleğini bırakmak için bir sarmalayıcı kabuk komut dosyasıyla ihtiyacınız olanın çoğuna sahipsiniz.
Craig Ringer

Yanıtlar:


29

Yaygın olarak kullanılan araç EXPLAIN ANALYZE, muhtemelen cevapta daha fazla ayrıntı için daha fazla seçenek içeren SQL komutudur . Bu, sorgu planını, planlayıcı tahminleri artı gerçek yürütme süreleriyle birlikte verir.

Neden önbelleği temizlemek istiyorsun? Genel olarak daha muhtemel kullanım durumu, önbelleğin doldurulmasıdır. Hala o rotaya gitmek istiyorsanız, burada SO ile ilgili bir cevap .

Değil önbellek sıfırlama, burada birçok yinelemeleriyle testine iki basit yolu vardır:

Basit UDF

EXPLAIN ANALYZE
SELECT f_myfunc(g) FROM generate_series (1,1000) AS t(g);

Veya rasgele girdiyle - örnekte 0 ile 5000 arasında rasgele sayılar:

EXPLAIN ANALYZE
SELECT f_myfunc((random()*5000)::int) FROM generate_series (1,1000) AS t(g);

Veya gerçek bir yaşam tablosu ile:

EXPLAIN ANALYZE
SELECT f_myfunc(my_column) FROM my_tbl;   -- LIMIT n

Daha karmaşık fonksiyonlar / sorgular

CREATE FUNCTION f_test(ct int, sql text) RETURNS void AS
$func$
DECLARE
   i int;
BEGIN

FOR i IN 1 .. $1 LOOP
    EXECUTE sql;  -- not safe against SQLi!
END LOOP;

END
$func$ LANGUAGE plpgsql

Aramak:

EXPLAIN ANALYZE
SELECT f_test(100, $x$SELECT * from MADLIB.gp('mock3', '{x1, x2, x3}', '{y1}', 100,20, 3)$x$

Dikkatli : Sorgu aslında yürütülür!
Dikkatli : Halka açık kullanım için uygun değildir. Olası SQL enjeksiyonu.

Yine, gerekirse rastgele parametreleri kullanabilirsiniz. Muhtemelen USINGmadde ile EXECUTE.

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.