2016-11-19 2 views
0

Auf einer komplexen Webseite werden mehr als hundert Abfragen ausgeführt. Ich suche nach einer Möglichkeit, diese Abfragen zu benchmarken. Ich habe versucht, EXPLAIN ANALYZE in eine Abfrage einzubetten. in eine psql-Funktion, um die Ausführungszeit jeder Abfrage auszuwählen und zu vergleichen. Aber EXPLAIN ANALYSE scheint nicht in irgendeiner Weise einzubetten.Benchmarking vieler PostgreSQL-Abfragen

Gibt es eine andere Lösung, um die Ausführungszeit einiger Abfragen zu vergleichen?

Vielen Dank

+1

[Fehlerberichterstattung und Protokollierung] (https://www.postgresql.org/docs/current/static/runtime-config-logging.html) und [pg_stat_statements] (https://www.postgresql.org/docs /current/static/pgstatstatements.html) PS: "_Auf einer komplexen Webseite werden mehr als ** ** Anfragen ausgeführt. _" - jetzt weiß ich, warum das Web immer langsamer wird: o ( – Abelisto

Antwort

2

Es gibt kein Problem EXPLAIN in PL mit Einbett-/pgSQL:

CREATE OR REPLACE FUNCTION profile(
     IN query text, 
     OUT total_cost double precision, 
     OUT runtime double precision 
    ) RETURNS record 
    LANGUAGE plpgsql STRICT AS 
$$DECLARE 
    j json; 
BEGIN 
    EXECUTE 'EXPLAIN (ANALYZE, FORMAT JSON) ' || query INTO j; 
    total_cost := (j->0->'Plan'->>'Total Cost')::double precision; 
    runtime := (j->0->'Plan'->>'Actual Total Time')::double precision; 
    RETURN; 
END;$$; 

Sie es zum Beispiel verwenden können, wie folgt:

test=> SELECT * FROM profile($$SELECT * FROM large WHERE val = 'mama'$$); 
┌────────────┬─────────┐ 
│ total_cost │ runtime │ 
├────────────┼─────────┤ 
│ 14542.43 │ 207.836 │ 
└────────────┴─────────┘ 
(1 row) 

nicht verwenden es mit nicht vertrauenswürdigen Abfragen, da die Funktion anfällig für SQL-Injektion ist.

+0

Danke, das ist genau was ich brauche. –