web-dev-qa-db-ja.com

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
34
user425243

テスト目的で 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
    );

クエリプランに加えて、合計ランタイムが表示されます。数回実行して、アーティファクトを除外します。
A オプションのカップル を使用して詳細を確認できます。

65

書いているプログラムではなく、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
80
Peter

PostgreSQLはTransact-SQLではありません。これらは2つのわずかに異なるものです。

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;
38
filiprem