Come posso eseguire il benchmark di una query PostgreSQL?


34

Voglio fare un benchmark di una query contenente una funzione definita dall'utente che ho scritto per PostgreSQL. Esistono modi standard per eseguire un simile benchmark?

So che il tempismo può essere attivato con \timingil prompt di psql, ma idealmente mi piacerebbe avere uno script che si occupi di tutto automaticamente: eseguire la query alcune volte, svuotare la cache PostgreSQL dopo ogni esecuzione (probabilmente riavviando PostgreSQL servizio) e fornire il tempo medio di esecuzione (e la memoria utilizzata è un vantaggio).


3
Check out pgbench; puoi eseguirlo con script personalizzati per fare alcune delle cose che vuoi. Con uno script della shell wrapper per arrestare e riavviare Pg e rilasciare la cache del disco del sistema operativo hai quasi tutto ciò di cui hai bisogno.
Craig Ringer,

Risposte:


29

Lo strumento ampiamente utilizzato è il comando SQL EXPLAIN ANALYZE, possibilmente con più opzioni per maggiori dettagli nella risposta. Ciò genera il piano di query con le stime del planner più i tempi di esecuzione effettivi.

Perché dovresti voler cancellare la cache? Il caso d'uso generalmente più probabile è che la cache sia popolata. Se vuoi ancora seguire questa strada, ecco una risposta correlata su SO .

Non reimpostare la cache, ecco due semplici modi per testare con molte iterazioni:

UDF semplice

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

O con input casuale - numeri casuali tra 0 e 5000 nell'esempio:

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

O con una tabella di vita reale:

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

Funzioni / query più complesse

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

Chiamata:

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

Attenzione : la query viene effettivamente eseguita!
Attenzione : non adatto all'uso pubblico. Possibile iniezione SQL.

Ancora una volta, è possibile utilizzare parametri casuali, se necessario. Forse con la USINGclausola di EXECUTE.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.