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

Tôi không thể nhận được thời gian truy vấn. Thay vào đó, tôi nhận được lỗi sau:Nhận thời gian thực hiện truy vấn PostgreSQL

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

Tôi thử nghiệm này truy vấn trên studio SQL của tôi, chỉ cần thay thế 'select distinct ...' với một cái gì đó trong DB của tôi và nó hoạt động tốt. Bạn đang sử dụng những gì để thực hiện truy vấn này? –

+0

m chạy truy vấn trên trong postgres !! : -/ –

+0

Chính xác thì bạn đang cố gắng làm gì? Điều này dường như không liên quan gì đến Java hoặc JDBC (và từ bình luận của bạn, thậm chí không phải MySql). Đây có phải là thủ tục được lưu trữ không? – pcalcao

Trả lời

44

Đối với mục đích thử nghiệm, bạn cũng có thể sử dụng EXPLAIN ANALYZE.

Bạn có thể sử dụng nó như thế này để kiểm tra xem phiên bản chuyển thể của tôi về câu hỏi của bạn, trên thực tế, nhanh hơn:

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

Hiển thị tổng thời gian chạy ngoài các kế hoạch truy vấn. Thực hiện một vài lần để loại bỏ hiện vật.
A couple of options có sẵn để biết thêm chi tiết.

30

PostgreSQL không phải là Giao dịch-SQL. Đây là hai điều hơi khác nhau.

Trong PostgreSQL, đây sẽ là một cái gì đó dọc theo dòng của

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

Mặt khác, đo thời gian truy vấn không phải là phức tạp này.

Đầu tiên, trong postgres command line client bạn có \timing tính năng đo thời gian truy vấn trên phía máy khách (tương tự như thời lượng ở góc dưới cùng của SQL Server Management Studio).

Thứ hai, có thể record query time in milliseconds (đối với mọi truy vấn hoặc chỉ khi nó kéo dài hơn X mili giây).

Thứ ba, nó có thể thu thập thời gian server-side cho bất kỳ tuyên bố duy nhất sử dụng EXPLAIN:

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

để đề cập \ thời gian –

26

Nếu bạn có ý nghĩa trong psql, chứ không phải là một số chương trình bạn đang viết, sử dụng \? cho sự giúp đỡ, và thấy:

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

Và sau đó bạn sẽ có được sản lượng như:

# \timing on 
Timing is on. 

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

Time: 0.203 ms 
+1

Cảm ơn bạn đã đưa ra câu trả lời đơn giản, cơ bản cho tiêu đề của câu hỏi này. –

+1

Tôi đây là cách trực tiếp và dễ nhất để hiển thị thời gian ở bưu điện. Cảm ơn! –

Các vấn đề liên quan