Получить время выполнения запроса PostgreSQL
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
Ответы
Ответ 1
Для целей тестирования вы также можете использовать 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
);
Показывает общую продолжительность выполнения в дополнение к плану запроса. Выполните несколько раз, чтобы исключить артефакты.
несколько опций доступны для более подробной информации.
Ответ 2
PostgreSQL не является Transact-SQL. Это две разные вещи.
В PostgreSQL это будет нечто вроде строк
DO $proc$
DECLARE
StartTime timestamptz;
EndTime timestamptz;
Delta interval;
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;
Ответ 3
Если вы имеете в виду в 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