it-swarm.com.de

Ruft die Ausführungszeit der PostgreSQL-Abfrage ab

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]

Ich kann die Abfragezeit nicht abrufen. Stattdessen erhalte ich folgende Fehlermeldung:

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

Zu Testzwecken können Sie auch EXPLAIN ANALYZE .

Auf diese Weise können Sie überprüfen, ob meine angepasste Version Ihrer Abfrage tatsächlich schneller ist:

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
    );

Zeigt zusätzlich zum Abfrageplan die Gesamtlaufzeit an. Führen Sie einige Male aus, um Artefakte auszuschließen.
A einige Optionen stehen für weitere Details zur Verfügung.

65

Wenn Sie in psql meinen, anstatt eines Programms, das Sie schreiben, verwenden Sie \? für die Hilfe und siehe:

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

Und dann bekommst du eine Ausgabe wie:

# \timing on
Timing is on.

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

Time: 0.203 ms
80
Peter

PostgreSQL ist nicht Transact-SQL. Dies sind zwei leicht unterschiedliche Dinge.

In PostgreSQL wäre dies etwas in der Art von

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$;

Andererseits muss das Messen der Abfragezeit nicht so kompliziert sein.

Zuerst haben Sie in Postgres-Befehlszeilen-Client\timing Feature, das die Abfragezeit auf Client-Seite misst (ähnlich der Dauer in der unteren rechten Ecke von SQL Server Management Studio).

Zweitens ist es möglich, Abfragezeit in Millisekunden aufzuzeichnen (für jede Abfrage oder nur, wenn sie länger als X Millisekunden dauerte).

Drittens ist es möglich, das serverseitige Timing für eine einzelne Anweisung mit EXPLAIN zu erfassen:

EXPLAIN (ANALYZE, BUFFERS) YOUR QUERY HERE;
38
filiprem