Я хочу сравнить запрос, содержащий пользовательскую функцию, которую я написал для PostgreSQL. Существуют ли стандартные способы запуска такого теста?
Я знаю, что синхронизацию можно включить с \timing
помощью приглашения psql, но в идеале я хотел бы иметь скрипт, который обо всем позаботится автоматически: несколько раз выполнять запрос, очищать кеш PostgreSQL после каждого запуска (возможно, перезапуская PostgreSQL службы), и выводит среднее время работы (и используемая память является плюсом).
postgresql
benchmark
Франк Дернонкур
источник
источник
pgbench
; Вы можете запустить его с помощью пользовательских сценариев, чтобы сделать то, что вы хотите. С помощью сценария оболочки-оболочки для остановки и перезапуска Pg, а также для удаления дискового кэша ОС у вас есть большая часть того, что вам нужно.Ответы:
Широко используемым инструментом является команда SQL
EXPLAIN ANALYZE
, возможно, с большим количеством опций для более подробной информации в ответе. Это выводит план запроса с оценками планировщика плюс фактическое время выполнения.Почему вы хотите очистить кеш? Обычно более вероятный вариант использования - заполнение кэша. Если вы все еще хотите пойти по этому пути, вот соответствующий ответ на SO .
Не сбрасывая кеш, вот два простых способа тестирования с множеством итераций:
Простой UDF
Или со случайным вводом - случайные числа от 0 до 5000 в примере:
Или с таблицей из реальной жизни:
Более сложные функции / запросы
Вызов:
Осторожно : запрос фактически выполнен!
Осторожно : не подходит для публичного использования. Возможно внедрение SQL.
Опять же, вы можете использовать случайные параметры, если это необходимо. Возможно с
USING
пунктомEXECUTE
.источник