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

का निष्पादन समय प्राप्त करें मैं क्वेरी समय प्राप्त करने में असमर्थ हूं। इसके बजाय मैं निम्नलिखित त्रुटि मिलती है:PostgreSQL क्वेरी

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

मैं इस परीक्षण किया मेरे एसक्यूएल स्टूडियो पर पूछताछ, बस मेरे डीबी में कुछ के साथ अपने 'चयन अलग ...' की जगह और यह ठीक काम किया। इस क्वेरी को निष्पादित करने के लिए आप क्या उपयोग कर रहे हैं? –

+0

मीटर पोस्टग्रेज़ में उपर्युक्त क्वेरी चला रहा है !! : -/ –

+0

आप वास्तव में क्या करने की कोशिश कर रहे हैं? यह जावा या जेडीबीसी से संबंधित नहीं है (और आपकी टिप्पणी से, यहां तक ​​कि MySQL भी नहीं)। क्या यह एक संग्रहीत प्रक्रिया है? – pcalcao

उत्तर

44

परीक्षण प्रयोजनों आप भी EXPLAIN ANALYZE उपयोग कर सकते हैं।

आपको यह देखना होगा आपकी क्वेरी के मेरी रूपांतरित संस्करण है कि क्या, वास्तव में, तेजी से इस तरह इसका इस्तेमाल कर सकते हैं:

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

क्वेरी योजना के अलावा कुल रनटाइम दिखाता है। कलाकृतियों को बाहर करने के लिए दो बार निष्पादित करें।
couple of options अधिक जानकारी के लिए उपलब्ध हैं।

30

PostgreSQL Transact-SQL नहीं है। ये दो अलग-अलग चीजें हैं।

PostgreSQL में, यह दूसरी ओर

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

की तर्ज पर कुछ हो सकता है, क्वेरी समय को मापने के इस जटिल होना जरूरी नहीं है।

सबसे पहले, postgres command line client में आपके पास \timing सुविधा है जो क्लाइंट पक्ष पर क्वेरी समय मापती है (SQL सर्वर प्रबंधन स्टूडियो के निचले कोने में अवधि के समान)।

दूसरा, यह record query time in milliseconds (प्रत्येक क्वेरी के लिए, या केवल जब यह एक्स मिलीसेकंड से अधिक समय तक चला) के लिए संभव है।

तीसरा, यह किसी एक बयान EXPLAIN प्रयोग करने के लिए सर्वर साइड समय इकट्ठा करने के लिए संभव है:

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

उल्लेख करने के लिए \ timing –

26

आप psql में मतलब है, तो बजाय आप, लिख रहे हैं मदद के लिए \? का उपयोग करें, और देखो कुछ कार्यक्रम की तुलना में:

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

और फिर आप उत्पादन की तरह मिलती है:

# \timing on 
Timing is on. 

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

Time: 0.203 ms 
+1

इस प्रश्न के शीर्षक के लिए सरल, अंतर्निहित उत्तर देने के लिए धन्यवाद। –

+1

मैं पोस्टग्रेज़ में समय दिखाने का सबसे प्रत्यक्ष और आसान तरीका है। धन्यवाद! –