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

Nie mogę uzyskać czasu zapytania. Zamiast tego pojawia się następujący błąd:Uzyskaj czas wykonywania zapytania PostgreSQL

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

Przetestowałem to zapytanie do mojego SQL studio, po prostu zastąpienie twojego 'select distinct ...' czymś w moim DB i działało dobrze. Czego używasz do wykonania tego zapytania? –

+0

m uruchomienie powyższego zapytania w postgresie !! : -/ –

+0

Co dokładnie próbujesz zrobić? Nie wydaje się to wcale związane z Javą lub JDBC (iz twojego komentarza, nawet MySql). Czy to jest procedura przechowywana? – pcalcao

Odpowiedz

44

Dla celów testowych można również użyć EXPLAIN ANALYZE.

Można go używać w ten sposób, by sprawdzić, czy mój dostosowana wersja zapytaniu jest w rzeczywistości, szybciej:

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

Pokazuje całkowity czas pracy oprócz planu kwerend. Wykonaj kilka razy, aby wykluczyć artefakty.
A couple of options są dostępne po więcej szczegółów.

30

PostgreSQL nie jest językiem Transact-SQL. To są dwie nieco różne rzeczy.

W PostgreSQL, to byłoby coś wzdłuż linii

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

Z drugiej strony, pomiar czasu zapytania nie musi być to skomplikowane.

Po pierwsze, w postgres command line client masz funkcję \timing, która mierzy czas zapytania po stronie klienta (podobnie jak w prawym dolnym rogu SQL Server Management Studio).

Po drugie, możliwe jest record query time in milliseconds (dla każdego zapytania lub tylko wtedy, gdy trwa dłużej niż X milisekund).

Po trzecie, jest to możliwe, aby zebrać po stronie serwera taktowanie dla każdej pojedynczej instrukcji z wykorzystaniem EXPLAIN:

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

za wspomnienie \ timing –

26

Jeśli masz na myśli w psql, zamiast jakiegoś programu piszesz, użyj \? za pomoc i zobaczyć:

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

a następnie dostać wyjście jak:

# \timing on 
Timing is on. 

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

Time: 0.203 ms 
+1

Dzięki za udzielenie prostej, podstawowej odpowiedzi na tytuł tego pytania. –

+1

To jest najbardziej bezpośredni i najprostszy sposób na pokazanie czasu w postgresie. Dzięki! –

Powiązane problemy