2016-11-19 1 views
0

На сложной веб-странице выполнено более ста запросов. Я ищу способ проверить эти запросы. Я попытался вставить EXPLAIN ANALYZE в запрос соответственно. в функцию psql, чтобы выбрать время выполнения каждого запроса и сравнить их. Но EXPLAIN ANALYZE, кажется, не встраивается каким-либо образом.Бенчмаркинг многих запросов PostgreSQL

Есть ли другое решение для сравнения времени выполнения некоторых запросов?

Большое спасибо

+1

[Отчеты об ошибках и протоколирование] (https://www.postgresql.org/docs/current/static/runtime-config-logging.html) и [pg_stat_statements] (https://www.postgresql.org/docs /current/static/pgstatstatements.html) PS: «На сложной веб-странице более ** сотен ** запросов выполнены._» - пока я знаю, почему сеть становится медленнее и медленнее: o ( – Abelisto

ответ

2

Там нет никаких проблем с вложением EXPLAIN в PL/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;$$; 

Вы можете использовать его, например, следующим образом:

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

Не используйте он с ненадежными запросами, поскольку функция уязвима для SQL-инъекции.

+0

Спасибо, это точно Что мне нужно. –