获取PostgreSQL查询的执行时间

38 sql postgresql performance

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]
Run Code Online (Sandbox Code Playgroud)

我无法获得查询时间.相反,我收到以下错误:

sql:/home/an/Desktop/dbms/query.sql:9: ERROR:  syntax error at or near "@"
LINE 1: DECLARE @StartTime datetime,@EndTime datetime
Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 86

如果您的意思是在psql中,而不是您正在编写的某个程序,请使用\?帮助,并查看:

\timing [on|off]       toggle timing of commands (currently off)
Run Code Online (Sandbox Code Playgroud)

然后你得到如下输出:

# \timing on
Timing is on.

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

Time: 0.203 ms
Run Code Online (Sandbox Code Playgroud)

  • 感谢您为这个问题的标题提供简单的基础答案. (4认同)
  • 我这是在postgres中显示时间的最直接,最简单的方法.谢谢! (3认同)

Erw*_*ter 67

出于测试目的,您也可以使用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
    );
Run Code Online (Sandbox Code Playgroud)

除查询计划外,还显示总运行时间.执行几次以排除工件.
两个选项可供更多详细信息.


fil*_*rem 39

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$;
Run Code Online (Sandbox Code Playgroud)

另一方面,测量查询时间不一定是这么复杂.

首先,在postgres命令行客户端中,您具有\timing测量客户端查询时间的功能(类似于SQL Server Management Studio右下角的持续时间).

其次,可以以 毫秒单位记录查询时间(对于每个查询,或仅在持续时间超过X毫秒时).

第三,可以使用以下方法收集任何单个语句的服务器端计时EXPLAIN:

EXPLAIN (ANALYZE, BUFFERS) YOUR QUERY HERE;
Run Code Online (Sandbox Code Playgroud)

  • 提及\时间 (2认同)