एसक्यूएल में कहां-कहां क्लॉजेज का मामला है?


121

मान लें कि मेरे पास एक तालिका है 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खंड में पहले आता है , और रिकॉर्ड अधिक कुशलता से समाप्त हो जाएंगे। मुझे नहीं लगता कि ऑप्टिमाइज़र पहले sql को अनुकूलित करने के लिए पर्याप्त स्मार्ट है।

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


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

3
जब आप इन दो वक्तव्यों को चलाते हैं तो आपकी क्या टिप्पणियां थीं? क्रियान्वयन की योजनाएं क्या दिखती थीं?
कॉनराड फ्रैक्स

3
क्या आप किसी विशिष्ट RDBMS की बात कर रहे हैं? वास्तव में मतभेद हैं।
बोलेर्न


जवाबों:


101

नहीं, यह आदेश मायने नहीं रखता (या कम से कम: कोई बात नहीं होनी चाहिए)।

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

मुझे पता है कि SQL सर्वर क्वेरी ऑप्टिमाइज़र एक उपयुक्त अनुक्रमणिका चुन लेगा - चाहे आपके पास अपनी दो स्थितियां हों, कोई भी आदेश नहीं है। मुझे लगता है कि अन्य RDBMS में समान रणनीति होगी।

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

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

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

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


यदि कोई इंडेक्स नहीं है, तो डेटा के आधार पर ऑप्स सही हो सकता है। इंडेक्स के बिना इस तरह से कम करने वाला कोर्स, एक अजीब फैसला होगा ...
टोनी हॉपकिंसन

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

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

3
एक अजीब बात यह है कि एक क्वेरी के पहले निष्पादन के लिए WHERE क्लॉज में शर्तों का क्रम क्या होता है! मेरे पास दो शर्तें थीं, जैसे कुछ: WHERE T1.col_1/T2.col_2 > 10 AND T2.col_2 <> 0और एक DIVIDE BY 0त्रुटि हुई। आदेश को स्विच करने के बाद जिन स्थितियों में क्वेरी को सफलतापूर्वक निष्पादित किया गया था। फिर मैंने ऑर्डर वापस कर दिया, इसलिए मैं फिर से त्रुटि प्राप्त करने की उम्मीद करूंगा, लेकिन इस बार यह काम किया! अंत में मेरा निष्कर्ष यह था कि पहले रन के लिए आदेश मायने रखता है, जब तक कि निष्पादन योजना नहीं बन जाती। उसके बाद आदेश नहीं आता है ऑप्टिमाइज़र / निष्पादन योजना के कारण 'टी मैटर' इसकी देखभाल करेगा
राडू घोरघिउ

1
मुझे पसंद है कि आपने कहा, "... या कम से कम: कोई फर्क नहीं पड़ना चाहिए" - मैं पूरी तरह से सहमत हूं। कभी-कभी यह दुर्भाग्य की बात है। मैंने ऐसे मामलों को देखा है, जहां एसक्यूएल ऑप्टिमाइज़र को संभालने के लिए बहुत जटिल था, और कॉलम ऑर्डर और टेबल जॉइन ऑर्डर जैसी चीजों से फर्क पड़ा। यह RDBMS, SQL कथन जटिलता और यहां तक ​​कि रिलीज़ पर निर्भर करता है। बहुत जटिल एसक्यूएल के परिणामस्वरूप खराब ऑप्टिमाइज़र निर्णय या ऑप्टिमाइज़र कोड में हार्ड-कोडित चूक का उपयोग हो सकता है।
विक्टर डि लियो

19

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

ऐसा मत सोचो कि SQL ऑर्डर के बारे में परवाह करता है। निम्न SQL सर्वर में कोई त्रुटि उत्पन्न करता है:

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

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


उस त्रुटि के कारण होने वाली क्वेरी का मूल्यांकन मूल्यांकन के आदेश के साथ क्या करना है?
जिम

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

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

बस यह सुनिश्चित करने के लिए कि मैंने जाँच की कि क्या स्थितियों की अदला-बदली के कारण SQL सर्वर उन्हें दूसरे तरीके से संभाल सकता है, लेकिन यह चारों ओर से विफल रहता है। मुझे लगता है कि यह दो चीजों में से किसी एक का मतलब हो सकता है: (1) यह अनुकूलन नहीं कर सकता है और साथ ही (2) यह एक संकलन-समय की त्रुटि है और SQL कुछ भी तुलना करने की कोशिश करने के लिए शुरू नहीं करता है, प्रारंभिक बाहर घूम रहा है। मेरा अनुमान है कि यह एन.आर. 2.
लुई सोमरस

9

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

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

...

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

यहां से नकल की गई


2

नहीं, सभी RDBMs पहले क्वेरी का विश्लेषण करके शुरू करते हैं और अपने जहाँ खंड को पुनः व्यवस्थित करके इसे अनुकूलित करते हैं।

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

म।


यह सूचकांक पर आधारित है। तो यह सामग्री के मामले में अप्रत्यक्ष है।
टोनी हॉपकिंसन

1

मूल ओपी बयान

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

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

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


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.