Bagaimana saya bisa membandingkan permintaan PostgreSQL?


34

Saya ingin membandingkan permintaan yang berisi fungsi yang ditentukan pengguna yang saya tulis untuk PostgreSQL. Apakah ada cara standar untuk menjalankan tolok ukur seperti itu?

Saya tahu bahwa pengaturan waktu dapat diaktifkan dengan \timingprompt psql, tetapi idealnya saya ingin memiliki skrip yang menangani semuanya secara otomatis: menjalankan kueri beberapa kali, membersihkan cache PostgreSQL setelah setiap kali dijalankan (mungkin dengan me-restart PostgreSQL layanan), dan keluaran waktu berjalan rata-rata (dan memori yang digunakan adalah nilai tambah).


3
Lihat pgbench; Anda dapat menjalankannya dengan skrip khusus untuk melakukan apa yang Anda inginkan. Dengan skrip shell pembungkus untuk berhenti dan restart Pg dan untuk menjatuhkan cache disk OS Anda memiliki sebagian besar dari apa yang Anda butuhkan.
Craig Ringer

Jawaban:


29

Alat yang banyak digunakan adalah perintah SQL EXPLAIN ANALYZE, mungkin dengan lebih banyak opsi untuk lebih detail dalam jawabannya. Itu menampilkan rencana permintaan dengan perkiraan perencana ditambah waktu eksekusi aktual.

Mengapa Anda ingin menghapus cache? Kasus penggunaan yang umumnya lebih mungkin adalah bahwa cache diisi. Jika Anda masih ingin menempuh rute itu, berikut adalah jawaban terkait pada SO .

Tidak mengatur ulang cache, berikut adalah dua cara sederhana untuk menguji dengan banyak iterasi:

UDF sederhana

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

Atau dengan input acak - angka acak antara 0 dan 5000 pada contoh:

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

Atau dengan tabel kehidupan nyata:

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

Fungsi / kueri yang lebih kompleks

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

Panggilan:

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

Hati-hati : Permintaan sebenarnya dieksekusi!
Hati-hati : Tidak cocok untuk penggunaan umum. Kemungkinan injeksi SQL.

Sekali lagi, Anda dapat menggunakan parameter acak jika diperlukan. Mungkin dengan USINGklausa EXECUTE.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.