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
答案 0 :(得分:66)
如果您的意思是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
答案 1 :(得分:57)
出于测试目的,您还可以使用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
);
显示除查询计划之外的总运行时间。执行几次以排除伪影 couple of options可用于了解更多详情。
答案 2 :(得分:35)
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 command line client中,您具有\timing
功能,用于衡量客户端的查询时间(类似于SQL Server Management Studio右下角的持续时间)。
其次,可以record query time in milliseconds(对于每个查询,或者只有当它持续超过X毫秒时)。
第三,可以使用EXPLAIN
收集任何单个语句的服务器端时序:
EXPLAIN (ANALYZE, BUFFERS) YOUR QUERY HERE;