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
À 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.
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
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;