Как рассчитать накопленную сумму времени запросов? - PullRequest
3 голосов
/ 14 июня 2019

У меня есть файл sql, выполняющий много запросов.Я хочу видеть накопленную сумму всех запросов.Я знаю, что если я включу синхронизацию или вызову

\timing
 query 1;
 query 2;
 query 3;
 ...
 query n;

в начале сценария, он начнет показывать время, необходимое для выполнения каждого запроса.Тем не менее, мне нужно получить результаты всех запросов, не добавляя их вручную.

Есть ли систематический способ?Если нет, как я могу получить промежуточные времена, чтобы бросить их в переменную.

Ответы [ 2 ]

4 голосов
/ 14 июня 2019

pg_stat_statements - хороший модуль, который предоставляет средства для отслеживания статистики выполнения.

  1. Сначала добавьте pg_stat_statements к shared_preload_libraries в postgresql.conf файл. Чтобы знать, где этот файл .conf существует в вашем файловая система, запустить show config_file;

    shared_preload_libraries = 'pg_stat_statements'
    
  2. Перезапустить базу данных Postgres
  3. Создать расширение

    CREATE EXTENSION pg_stat_statements;
    

Теперь модуль предоставляет View, pg_stat_statements, который помогает анализировать различные показатели выполнения запросов.

Сбросить содержимое статистики, собранной перед выполнением запросов.

SELECT pg_stat_statements_reset();

Теперь запустите файл скрипта, содержащий запросы.

\i script_file.sql

Вы можете получить всю статистику по времени для всех выполненных запросов. Чтобы получить общее время, просто наберите

select sum(total_time) from  pg_stat_statements 
    where query !~* 'pg_stat_statements';

Время, которое вы получаете, находится в milliseconds, который может быть преобразован в желаемый формат с использованием различных timestamp связанных с Postgres функций

0 голосов
/ 14 июня 2019

Если вы хотите рассчитать весь сценарий, на linux или mac вы можете использовать утилиту time для запуска сценария.

Измерение в этом случае немного больше, чем сумма времени необработанного запроса, потому что он включает некоторые накладные расходы на запуск и запуск команды psql. В моей системе эта нагрузка составляет около 20 мс.

$ time psql < script.sql

…

real    0m0.117s
user    0m0.008s
sys     0m0.007s

Значение real - это время, которое потребовалось для выполнения всего сценария, включая вышеупомянутые накладные расходы.


Подход в этом ответе - грубый, простой способ на стороне клиента измерить время выполнения всего сценария. Бесполезно измерять время выполнения на стороне сервера с точностью до миллисекунды. Это все еще может быть достаточно для многих вариантов использования.

Решение Kaushik Nayak - это более точный способ измерения времени выполнения прямо на сервере. Он также предоставляет гораздо больше информации о выполнении (например, время на уровне запроса).

...