2012-01-30 13 views
16
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] 

No puedo obtener el tiempo de consulta. En cambio me sale el siguiente error:Obtener el tiempo de ejecución de la consulta de PostgreSQL

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

Probé esto consulta en mi SQL Studio, simplemente reemplazando su 'select distinct ...' con algo en mi DB y funcionó bien. ¿Qué estás usando para ejecutar esta consulta? –

+0

m ejecutando la consulta anterior en postgres !! : -/ –

+0

¿Qué estás tratando de hacer exactamente? Esto no parece en absoluto relacionado con Java o JDBC (y de su comentario, ni siquiera MySql). ¿Es esto un procedimiento almacenado? – pcalcao

Respuesta

44

Para propósitos de prueba también se puede utilizar EXPLAIN ANALYZE.

Usted puede utilizar de esta manera para comprobar si mi versión adaptada de la consulta es, de hecho, más rápido:

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

Muestra el tiempo total de ejecución, además del plan de consulta. Ejecute un par de veces para excluir artefactos.
A couple of options están disponibles para más detalles.

30

PostgreSQL no es Transact-SQL. Estas son dos cosas ligeramente diferentes.

En PostgreSQL, esto sería algo en la línea de

DO $proc$ 
DECLARE 
    StartTime timestamptz; 
    EndTime timestamptz; 
    Delta interval; 
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$; 

Por otro lado, la medición de tiempo de consulta no tiene por qué ser complicado.

Primero, en postgres command line client tiene la característica \timing que mide el tiempo de consulta en el lado del cliente (similar a la duración en la esquina inferior derecha de SQL Server Management Studio).

En segundo lugar, es posible record query time in milliseconds (para cada consulta, o solo cuando duró más de X milisegundos).

En tercer lugar, es posible recoger la sincronización de servidor para cualquier declaración única usando EXPLAIN:

EXPLAIN (ANALYZE, BUFFERS) YOUR QUERY HERE; 
+2

por mencionar \ timing –

26

Si usted quiere decir con psql, en lugar de algún programa que está escribiendo, utilizar \? por la ayuda, y ver:

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

Y entonces se obtiene una salida como:

# \timing on 
Timing is on. 

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

Time: 0.203 ms 
+1

Gracias por dar la respuesta simple y subyacente al título de esta pregunta. –

+1

Esta es la forma más directa y fácil de mostrar el tiempo en postgres. ¡Gracias! –

Cuestiones relacionadas