2012-07-11 17 views
75

में क्लॉज का मामला क्या है, मान लें कि मेरे पास PEOPLE नामक एक तालिका है जिसमें 3 कॉलम ID, LastName, FirstName हैं, इनमें से कोई भी कॉलम अनुक्रमित नहीं है।
LastName अधिक अद्वितीय है, और FirstName कम अद्वितीय है।एसक्यूएल

अगर मैं 2 खोज करते हैं:

select * from PEOPLE where FirstName="F" and LastName="L" 
select * from PEOPLE where LastName="L" and FirstName="F" 

मेरे विश्वास क्योंकि अधिक अद्वितीय कसौटी (LastName) where खंड में पहले आता है दूसरा एक तेजी से होता है है, और रिकॉर्ड और अधिक कुशलता से सफाया हो जाएगा। मुझे नहीं लगता कि अनुकूलक पहले एसक्यूएल को अनुकूलित करने के लिए पर्याप्त स्मार्ट है।

क्या मेरी समझ सही है?

+7

नहीं, यह आदेश कोई फर्क नहीं पड़ता - कोई भी सभ्य क्वेरी ऑप्टिमाइज़र ** सभी ** WHERE क्लॉज को देखेगा और उस क्वेरी को संतुष्ट करने का सबसे प्रभावी तरीका पता करेगा –

+3

जब आप इन दो कथनों को चलाते थे तो आपके अवलोकन क्या थे? निष्पादन योजनाओं की तरह क्या दिखता था? –

+3

क्या आप एक विशिष्ट आरडीबीएमएस का जिक्र कर रहे हैं? वास्तव में मतभेद हैं। – Bjoern

उत्तर

64

नहीं, वह आदेश कोई फर्क नहीं पड़ता (या कम से कम: कोई फर्क नहीं पड़ता)।

कोई भी सभ्य क्वेरी ऑप्टिमाइज़र WHERE खंड के हिस्सों को देखेगा और उस क्वेरी को संतुष्ट करने का सबसे प्रभावी तरीका पता लगाएगा।

मुझे पता है कि SQL सर्वर क्वेरी ऑप्टिमाइज़र एक उपयुक्त इंडेक्स लेगा - कोई फर्क नहीं पड़ता कि आपके पास कौन सी ऑर्डर है। मुझे लगता है कि अन्य आरडीबीएमएस की समान रणनीतियां होंगी।

इससे कोई फर्क नहीं पड़ता कि आपके पास इसके लिए उपयुक्त इंडेक्स है या नहीं!

एसक्यूएल सर्वर के मामले में, यह संभावना एक सूचकांक का उपयोग करेगा यदि आपके पास:

  • (LastName, FirstName)
  • एक सूचकांक पर एक सूचकांक (FirstName, LastName)
  • एक सूचकांक पर सिर्फ (LastName) पर, या बस (FirstName) (या दोनों)

दूसरी ओर - फिर से SQL सर्वर के लिए - यदि आप कोको पकड़ने के लिए उपयोग करते हैंसभी तालिका से कॉलम, और तालिका अपेक्षाकृत छोटी है, तो एक अच्छा मौका है कि क्वेरी ऑप्टिमाइज़र केवल एक इंडेक्स का उपयोग करने के बजाय एक टेबल (या क्लस्टर्ड इंडेक्स) स्कैन करेगा (क्योंकि पूर्ण डेटा पेज में लुकअप प्राप्त करने के लिए सभी अन्य कॉलम बहुत तेज़ी से बहुत महंगा हो जाते हैं)।

+0

यदि कोई अनुक्रमणिका नहीं है (एस) डेटा के आधार पर, ओप सही हो सकता है। पाठ्यक्रम इंडेक्स के बिना ऐसा कुछ कर रहा है, एक अजीब निर्णय होगा ... –

+0

@ टोनी होपकिन्सन: मुझे ऐसा नहीं लगता - यहां तक ​​कि इंडेक्स के बिना मुझे संदेह है कि इसमें कोई अंतर है। आखिरकार: इंडेक्स के बिना, आरडीबीएमएस क्या कर सकता है, एक पूर्ण टेबल स्कैन के अलावा और क्या वास्तव में ?? –

+2

एसक्यूएल सर्वर के साथ दिलचस्प साइड नोट, जाहिर है भविष्यवाणियों के भीतर मौजूद नहीं है, वास्तव में योजना निर्माण को प्रभावित कर सकता है: http://bradsruminations.blogspot.com/2010/04/looking-under-hood.html –

2

नहीं, सभी आरडीबीएम पहली बार क्वेरी का विश्लेषण करके शुरू करते हैं और इसे अपने क्लॉज को फिर से व्यवस्थित करके अनुकूलित करते हैं।

जो पर निर्भर करता है RDBM क्या आप प्रदर्शित कर सकते हैं विश्लेषण का परिणाम है क्या का उपयोग कर (के लिए उदाहरण के लिए ओरेकल में योजना की व्याख्या खोज)

एम

+0

यह इंडेक्स पर आधारित है। तो यह सामग्री के संदर्भ में अप्रत्यक्ष है। –

+0

वास्तव में यह तालिका आंकड़ों के आधार पर अधिकतर किया जाता है – poussma

9

के WHERE खंड एक नहीं करना चाहिए आदेश हैं एक डेटाबेस में अंतर जो SQL मानक के अनुरूप है। अधिकांश डेटाबेस में मूल्यांकन का आदेश गारंटी नहीं है।

ऐसा नहीं लगता कि SQL आदेश के बारे में परवाह करता है।

select * 
from INFORMATION_SCHEMA.TABLES 
where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0 

तो इस खंड के पहले भाग को मार डाला गया पहले तो केवल संख्यात्मक तालिका नाम पूर्णांक के रूप में डाली जाएगी: निम्नलिखित एसक्यूएल सर्वर में कोई त्रुटि उत्पन्न करता है। हालांकि, यह एक स्पष्ट उदाहरण प्रदान करता है कि SQL सर्वर (अन्य डेटाबेस के साथ) WHERE कथन में खंडों के क्रम के बारे में परवाह नहीं करता है।

+0

WHERE अनुमानित मूल्यांकन के आदेश के साथ त्रुटि उत्पन्न करने वाली क्वेरी को क्या करना पड़ता है? – Jim

+3

@Jim यदि 'ISNUMERIC (table_name) = 1' का मूल्यांकन पहले किया गया था, तो 'CAST' को केवल संख्यात्मक तालिका नामों के लिए बुलाया जाएगा। लेकिन चूंकि इसका मूल्यांकन पहले नहीं किया जाता है, इसलिए 'CAST' का मूल्यांकन गैर-संख्यात्मक तालिका नामों के लिए भी किया जाता है, साथ ही त्रुटि संदेश भी होता है। – hibbelig

+0

उत्कृष्ट स्पष्टीकरण – neeohw

0

यह सच है, जहां तक ​​यह जाता है, मानते हैं कि नाम अनुक्रमित नहीं हैं। हालांकि अलग-अलग डेटा इसे गलत बना देगा। यह करने के लिए कि यह किस तरह से किया जा सकता है, जो हर बार भिन्न हो सकता है, डीबीएमएस को प्रत्येक कॉलम के लिए एक अलग गिनती क्वेरी चलाने की आवश्यकता होती है और संख्याओं की तुलना करना पड़ता है, जो कि केवल शर्मनाक और उससे आगे बढ़ने से अधिक खर्च करेगा।

6

ANSI SQL ड्राफ्ट 2003 5WD-01-फ्रेमवर्क-2003-09.pdf

6.3.3.3 नियम मूल्यांकन आदेश

...

कहाँ पूर्वता प्रारूप द्वारा निर्धारित नहीं किया गया है या कोष्ठक द्वारा, अभिव्यक्तियों का प्रभावी मूल्यांकन आमतौर पर बाएं से दाएं से किया जाता है। हालांकि, यह कार्यान्वयन-निर्भर है कि अभिव्यक्तियों का वास्तव में बाएं से दाएं मूल्यांकन किया जाता है, खासकर जब ऑपरेंड या ऑपरेटरों को शर्तों को उठाया जा सकता है या अभिव्यक्ति के परिणाम अभिव्यक्ति के सभी हिस्सों का पूर्ण मूल्यांकन किए बिना निर्धारित किए जा सकते हैं।

here

1

मूल ओपी बयान से नकल

मेरे विश्वास क्योंकि अधिक अद्वितीय कसौटी (अंतिम नाम) में पहले आता है> जहां खंड, और रिकॉर्ड अधिक का सफाया हो जाएगा दूसरा एक तेजी से होता है है कुशलतापूर्वक। मुझे नहीं लगता कि अनुकूलक> पहले एसक्यूएल को अनुकूलित करने के लिए पर्याप्त स्मार्ट है।

मुझे लगता है कि आप इंडेक्स बनाने के दौरान कॉलम के क्रम को चुनने के साथ भ्रमित कर रहे हैं जहां आपको सबसे अधिक चुनिंदा कॉलम से पहले अधिक चुनिंदा कॉलम रखना होगा।

बीटीडब्ल्यू, उपर्युक्त दो क्वेरी के लिए SQL सर्वर अनुकूलक कोई अनुकूलन नहीं करेगा लेकिन योजना की कुल लागत समांतरता सीमा लागत से कम होने तक ट्राइविला योजना का उपयोग करेगी।