Як можна порівняти запит на PostgreSQL?


34

Я хочу порівняти запит, що містить визначену користувачем функцію, яку я написав для PostgreSQL. Чи існують якісь стандартні способи виконання такого еталону?

Я знаю, що синхронізацію можна ввімкнути за допомогою \timingзапиту psql, але в ідеалі я хотів би мати сценарій, який автоматично бере на себе все: виконати запит кілька разів, очистити кеш PostgreSQL після кожного запуску (ймовірно, перезапустивши PostgreSQL сервіс) та виводить середній час роботи (а використовувана пам'ять є плюсом).


3
Виїзд pgbench; ви можете запустити його за допомогою спеціальних сценаріїв, щоб зробити щось, що ви хочете. Скрипт оболонки обгортки для зупинки та перезавантаження Pg та скидання кеш-диска ОС у вас є більшість того, що вам потрібно.
Крейг Рінгер

Відповіді:


29

Широко використовуваний інструмент - команда SQL EXPLAIN ANALYZE, можливо, з додатковими опціями для отримання детальної інформації у відповіді. Це виводить план запитів із оцінками планувальника плюс фактичні часи виконання.

Чому ви хочете очистити кеш? Загалом більш імовірним випадком використання є те, що кеш заповнений. Якщо ви все ще хочете пройти цей маршрут, ось відповідна відповідь на ТАК .

Не скидаючи кеш, ось два простих способи тестування з багатьма ітераціями:

Простий АДС

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

Або з випадковим введенням - випадкові числа від 0 до 5000 у прикладі:

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

Або з таблицею реального життя:

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

Більш складні функції / запити

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

Виклик:

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

Обережно : Запит фактично виконується!
Обережно : Не підходить для громадського використання. Можлива ін'єкція SQL

Знову ж таки, ви можете використовувати випадкові параметри, якщо це потрібно. Можливо, з USINGпунктом EXECUTE.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.