web-dev-qa-db-fra.com

Obtenez le temps d'exécution de la requête 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]

Je ne parviens pas à obtenir l'heure de la requête. Au lieu de cela, j'obtiens l'erreur suivante:

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

À des fins de test, vous pouvez également utiliser EXPLAIN ANALYZE .

Vous pouvez l'utiliser comme ceci pour vérifier si ma version adaptée de votre requête est, en fait, plus rapide:

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

Affiche le temps d'exécution total en plus du plan de requête. Exécutez plusieurs fois pour exclure les artefacts.
A deux options sont disponibles pour plus de détails.

65
Erwin Brandstetter

Si vous voulez dire dans psql, plutôt que dans un programme que vous écrivez, utilisez \? pour l'aide, et voir:

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

Et puis vous obtenez une sortie comme:

# \timing on
Timing is on.

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

Time: 0.203 ms
80
Peter

PostgreSQL n'est pas Transact-SQL. Ce sont deux choses légèrement différentes.

Dans PostgreSQL, ce serait quelque chose dans le sens de

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

D'un autre côté, mesurer le temps de requête ne doit pas être aussi compliqué.

Tout d'abord, dans client de ligne de commande postgres vous avez \timing fonctionnalité qui mesure le temps de requête côté client (similaire à la durée dans le coin inférieur droit de SQL Server Management Studio).

Deuxièmement, il est possible de enregistrer le temps de requête en millisecondes (pour chaque requête, ou uniquement lorsqu'elle a duré plus de X millisecondes).

Troisièmement, il est possible de collecter la synchronisation côté serveur pour toute instruction unique à l'aide de EXPLAIN:

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