Получить время выполнения запроса PostgreSQL - PullRequest
32 голосов
/ 30 января 2012
DECLARE @StartTime datetime,@EndTime datetime

SELECT @StartTime=GETDATE()

select distinct born_on.name
from   born_on,died_on
where (FLOOR(('2012-01-30'-born_on.DOB)/365.25) <= (
    select max(FLOOR((died_on.DOD - born_on.DOB)/365.25))
    from   died_on, born_on
    where (died_on.name=born_on.name))
    )
and   (born_on.name <> All(select name from died_on))

SELECT @EndTime=GETDATE()

SELECT DATEDIFF(ms,@StartTime,@EndTime) AS [Duration in millisecs]

Я не могу получить время запроса. Вместо этого я получаю следующую ошибку:

sql:/home/an/Desktop/dbms/query.sql:9: ERROR:  syntax error at or near "@"
LINE 1: DECLARE @StartTime datetime,@EndTime datetime

Ответы [ 3 ]

75 голосов
/ 08 декабря 2015

Если вы имеете в виду psql, а не какую-то программу, которую вы пишете, используйте для справки \? и смотрите:

\timing [on|off]       toggle timing of commands (currently off)

И тогда вы получите вывод:

# \timing on
Timing is on.

# select 1234;        
 ?column? 
----------
     1234
(1 row)

Time: 0.203 ms
60 голосов
/ 30 января 2012

В целях тестирования вы также можете использовать EXPLAIN ANALYZE.

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

EXPLAIN ANALYZE
SELECT DISTINCT born_on.name
FROM   born_on b
WHERE  floor(('2012-01-30'::date - b.dob) / 365.25) <= (
    SELECT floor((max(d1.dod - b1.dob)/365.25))
    FROM   born_on b1
    JOIN   died_on d1 USING (name)
    )
AND NOT EXISTS (
    SELECT *
    FROM   died_on d2
    WHERE  d2.name = b.name
    );

Показывает общее время выполнения в дополнение к плану запроса. Выполните несколько раз, чтобы исключить артефакты.
* пара вариантов доступны для более подробной информации.

38 голосов
/ 30 января 2012

PostgreSQL не является Transact-SQL. Это две немного разные вещи.

В PostgreSQL это будет что-то вроде

DO $proc$
DECLARE
  StartTime timestamptz;
  EndTime timestamptz;
  Delta double precision;
BEGIN
  StartTime := clock_timestamp();
  PERFORM YOUR QUERY HERE;
  EndTime := clock_timestamp();
  Delta := 1000 * ( extract(epoch from EndTime) - extract(epoch from StartTime) );
  RAISE NOTICE 'Duration in millisecs=%', Delta;
END;
$proc$;

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

Во-первых, в клиенте командной строки postgres имеется функция \timing, которая измеряет время запроса на стороне клиента (аналогично продолжительности в правом нижнем углу SQL Server Management Studio).

Во-вторых, можно записать время запроса в миллисекундах (для каждого запроса или только если он длился дольше, чем X миллисекунд).

В-третьих, можно собрать синхронизацию на стороне сервера для любого отдельного оператора, используя EXPLAIN:

EXPLAIN (ANALYZE, BUFFERS) YOUR QUERY HERE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...