2011-01-26 29 views
26

क्या बीटवेन क्लॉज का उपयोग करने या < = AND> = तुलना का उपयोग करने के बीच कोई प्रदर्शन अंतर है?बनाम खंड बनाम <= AND > =

अर्थात इन दोनों प्रश्नों:

SELECT * 
    FROM table 
WHERE year BETWEEN '2005' AND '2010'; 

... और

SELECT * 
    FROM table 
WHERE year >= '2005' AND year <= '2010'; 

इस उदाहरण में, साल स्तंभ VARCHAR2 है (4) इस पर एक सूचकांक के साथ।

+4

मैं फिल्टर करने के लिए साल या दिनांक, हालांकि ' '2005'' की तरह एक स्ट्रिंग का उपयोग नहीं होता। –

उत्तर

16

दो उदाहरण प्रश्नों के बीच कोई प्रदर्शन अंतर नहीं है क्योंकि BETWEEN समेत रेंज तुलना को व्यक्त करने का एक शॉर्टेंड तरीका है। जब ओरेकल BETWEEN स्थिति को पार करता है तो यह स्वचालित रूप से अलग तुलना खंडों में विस्तारित हो जाएगा:

पूर्व।

SELECT * 
    FROM table 
WHERE column BETWEEN :lower_bound AND :upper_bound 

... स्वचालित रूप से बन जाएगा:

SELECT * 
    FROM table 
WHERE :lower_bound <= column 
    AND :upper_bound >= column 
+10

@rsenna: नहीं, मैंने यहां इस जानकारी को स्टोर करने के लिए पोस्ट किया क्योंकि हमारे कार्यालय में किसी ने मुझसे यह पूछा और मैंने देखा कि जब किसी और ने कभी इसे पहले कभी नहीं पूछा था। यह दिन के लिए दुनिया में मेरा ज्ञान योगदान है और एफएक्यू और मिशन कथन के अनुसार सेवा का वैध उपयोग है। मैं 10 सेकंड के भीतर अपने उत्तर पूछने, जवाब देने और स्वीकार करने का इरादा रखता हूं लेकिन सिस्टम मुझे अपने उत्तर को इतनी जल्दी स्वीकार नहीं करेगा कि अन्य लोगों ने भी जवाब देना शुरू किया ... – wweicker

+1

अरे, कोई समस्या नहीं। वास्तव में एसओ आधिकारिक तौर पर [अनुमोदित] (http://meta.stackexchange.com/questions/12513/should-i-not-answer-my-own-questions) ऐसे व्यवहार ... – rsenna

+0

@rsenna: बिल्कुल! :) उस लिंक को खोदने के लिए धन्यवाद, और परिदृश्य को और समझाने के लिए मैं भूल गया था कि आपको [अपने प्रश्न का उत्तर देने के लिए दो दिन इंतजार करना होगा] (http://blog.stackoverflow.com/2009/01/accept-your -उन-उत्तर /) ... – wweicker

22

कोई अंतर नहीं है।

ध्यान दें कि BETWEEN तर्कों के क्रम में हमेशा समावेशी और संवेदनशील होता है।

BETWEEN '2010' AND '2005' कभी भी TRUE नहीं होगा।

+1

अंतर्निहित आरडीबीएमएस प्रणाली पर निर्भर करता है। एसक्यूएल-9 2 कहता है कि "एक्स और जेड के बीच एक्स" एक्स एक्स = = वाई और एक्स <= जेड "_ के समतुल्य है लेकिन सभी विक्रेताओं को उस पंक्ति में नहीं है। उदाहरण के लिए, SQL सर्वर नहीं है। –

+0

@ निकोलस: कृपया प्रश्न टैग देखें। आपके लिए 'एसक्यूएल सर्वर' टिप्पणी के रूप में, क्या आप एक संदर्भ प्रदान कर सकते हैं? – Quassnoi

+0

जब तक वे चीजों को कड़ी मेहनत नहीं करते हैं, तो आदेश महत्वहीन नहीं है। यह नहीं कह सकता कि मैंने हाल ही में परीक्षण किया है। पहले उस पर जला दिया गया है, यदि परीक्षण के लिए आदेश महत्वपूर्ण है, तो मैं परीक्षण स्पष्ट परीक्षण '> = 'और' <= 'के साथ करता हूं। –

5

असल में यह आपके डीबीएमएस इंजन पर निर्भर करता है।

कुछ डेटाबेस प्रबंधन सिस्टम आपकी अभिव्यक्ति को दो बार गणना करेंगे (प्रत्येक तुलना के लिए एक बार), और केवल एक बार जब आप BETWEEN का उपयोग करेंगे।

अभिव्यक्ति एक गैर नियतात्मक परिणाम BETWEEN हो सकता है वास्तव में अगर एक अलग व्यवहार होगा, SQLite में निम्नलिखित तुलना: यह (उदाहरण के लिए) बहुत समय लग सकता है अगर आपके अभिव्यक्ति है

WHERE RANDOM() BETWEEN x AND y -- one random value generated 

WHERE RANDOM() >= x AND RANDOM() <= y -- two distinct random values generated 

एक सबक्वेरी।

+0

दिलचस्प विचार ... क्या आप इसके लिए एक उदाहरण प्रदान कर सकते हैं? आपने किस डेटाबेस के लिए इसका अनुभव किया? –

+0

@ लुकासएडर: उदाहरण देखें – Benoit

+0

हम्म, अच्छी सोच। इससे [SQL मानक] (http://stackoverflow.com/a/9680753/521799) के संबंध में कुछ खुले प्रश्न निकलते हैं, और क्या यह दावा करना वास्तव में संभव है कि दो अभिव्यक्ति समकक्ष –

2

संदेह में (ओरेकल के लिए वैसे भी), explain plan चलाएं और आप देखेंगे कि अनुकूलक क्या करना चाहता है। यह "के बीच एक प्रदर्शन अंतर है" के बारे में अधिकतर प्रश्नों पर लागू होगा। बेशक वहाँ कई अन्य टूल्स भी हैं, लेकिन योजना की व्याख्या करना एक अच्छी शुरुआत है।

1

यह समान होना चाहिए।

अच्छा डेटाबेस इंजन उस अभिव्यक्ति के लिए एक ही योजना उत्पन्न करेगा।

+0

हां हैं, मेरी टिप्पणी अधिक सामान्य थी यह विशिष्ट स्थिति। मछली को एक आदमी सिखाओ ... – tbone

0

यह इस के लिए SQL मानक पर विचार लायक हो सकता है (हालांकि यह सभी कार्यान्वयन के अनुरूप नहीं सकता है, भले ही वह चाहिए):

Format 

<between predicate> ::= 
    <row value constructor> [ NOT ] BETWEEN 
    <row value constructor> AND <row value constructor> 

Syntax Rules 

[...] 

6) "X BETWEEN Y AND Z" is equivalent to "X>=Y AND X<=Z". 

ऐसा कहा है, वहाँ में कोई अंतर नहीं है व्यवहार, हालांकि जटिल X के लिए, वहाँ समय पार्स करने में एक फर्क, हो सकता है के रूप में Benoit here

http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

में मिला ने उल्लेख किया 63,210
0

run1 "X> = Y और एक्स < = Z"

run2 "Y और Z के बीच एक्स"

जब मैं योजना दो बार समझाने चलाने मैं एक Plan hash value मिलता है। लेकिन टॉम की runStats_pkg diffent परिणाम प्राप्त:

Run1 ran in 1 cpu hsecs 
Run2 ran in 1 cpu hsecs 
run 1 ran in 100% of the time 

Name      Run1 Run2  Diff 
STAT...recursive calls   12  13  1 
STAT...CPU used by this sessio  2  3  1 
STAT...physical read total IO  0  1  1 
STAT...consistent gets   18  19  1 
... 
... 
LATCH.row cache objects   44,375 1,121  -43,254 
LATCH.cache buffers chains  68,814 1,397  -67,417 
STAT...logical read bytes from  655,360  573,440  -81,920 
STAT...session uga memory max  123,512  0 -123,512 
STAT...session pga memory  262,144 65,536 -196,608 
STAT...session pga memory max  262,144 65,536 -196,608 
STAT...session uga memory  -327,440 65,488  392,928 

Run1 latches total versus runs -- difference and pct 
Run1  Run2 Diff  Pct 
203,927  28,673 -175,254 711.22% 
संबंधित मुद्दे