2009-04-28 13 views
181

परिभाषा के अनुसार (कम से कम मैंने जो देखा है) सेर्गेबल का अर्थ है कि एक क्वेरी क्वेरी इंजन को निष्पादन योजना को अनुकूलित करने में सक्षम है जो क्वेरी का उपयोग करती है। मैंने जवाब देखने की कोशिश की है, लेकिन विषय वस्तु पर बहुत कुछ प्रतीत नहीं होता है। तो सवाल यह है कि एसक्यूएल क्वेरी क्या कर सकती है या नहीं? किसी भी दस्तावेज की सराहना की जाएगी।एसक्यूएल कथन को क्या योग्य बनाता है?

संदर्भ के लिए: Sargable

+41

"sargable" के लिए +1। आज के दिन का मेरा शब्द है। : -पी – BFree

+25

SARG = खोज ARGument। मजेदार बात यह है कि: जर्मन में "एसएआरजी" का अर्थ है "ताबूत", इसलिए जब लोग सर्जिकल के बारे में बात करते हैं तो मुझे हमेशा मुस्कान करना पड़ता है - एक ताबूत में डाल दिया जा सकता है? :-) –

+0

sargability आपके पर्यावरण पर निर्भर करता है। MySQL का यहां दस्तावेज किया गया है: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html –

उत्तर

178

सबसे आम बात यह है कि एक प्रश्न कर देगा गैर sargable जहां खंड में एक समारोह अंदर एक क्षेत्र को शामिल करने के लिए है myDate, भले ही कोई मौजूद है। इसे तालिका के प्रत्येक पंक्ति के लिए सचमुच इस समारोह का मूल्यांकन करना होगा। बहुत बेहतर उपयोग करने के लिए:

WHERE myDate >= '01-01-2008' AND myDate < '01-01-2009' 

कुछ अन्य उदाहरण:

Bad: Select ... WHERE isNull(FullName,'Ed Jones') = 'Ed Jones' 
Fixed: Select ... WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL)) 

Bad: Select ... WHERE SUBSTRING(DealerName,4) = 'Ford' 
Fixed: Select ... WHERE DealerName Like 'Ford%' 

Bad: Select ... WHERE DateDiff(mm,OrderDate,GetDate()) >= 30 
Fixed: Select ... WHERE OrderDate < DateAdd(mm,-30,GetDate()) 
+6

'GROUP BY' के अंदर एक फ़ंक्शन समेत एक क्वेरी को गैर-योग्य होने का कारण बन जाएगा? –

+0

@ माइकबेंटगेई बस ग्रुप बी में एक फ़ील्ड समेत इसे गैर-बड़े पैमाने पर नहीं बनाएगा, नहीं। सही इंडेक्स निश्चित रूप से ग्रुप बाय क्वेरी में मदद करेंगे। – BradC

+1

* कुछ * डेटाबेस इंजन (ओरेकल, पोस्टग्रेएसक्यूएल) अभिव्यक्तियों पर इंडेक्स का समर्थन करते हैं, नहीं जानते? – Craig

62

ऐसा मत करो:

WHERE Field LIKE '%blah%' 

एक मेज/सूचकांक स्कैन का कारण बनता है यही कारण है, क्योंकि जैसे मूल्य एक वाइल्डकार्ड वर्ण के साथ शुरू होता है।

ऐसा मत करो:

WHERE FUNCTION(Field) = 'BLAH' 

एक मेज/सूचकांक स्कैन का कारण बनता है कि।

डेटाबेस सर्वर को तालिका में प्रत्येक पंक्ति के विरुद्ध FUNCTION() का मूल्यांकन करना होगा और फिर इसे 'BLAH' से तुलना करना होगा।

यदि संभव हो, रिवर्स में यह कार्य करें:

WHERE Field = INVERSE_FUNCTION('BLAH') 

यह एक बार INVERSE_FUNCTION() पैरामीटर के खिलाफ चलेगा और अभी भी सूचकांक का उपयोग की अनुमति देगा।

SELECT ... FROM ... 
WHERE Year(myDate) = 2008 

एसक्यूएल अनुकूलक एक सूचकांक पर उपयोग नहीं कर सकते:

+3

फ़ंक्शन फ़्लिप करने के साथ आपका सुझाव वास्तव में केवल तभी काम करेगा जब फ़ंक्शन राउंड-ट्रिप डेटा (जिसका अर्थ है कि f (f (n)) = n)। –

+4

सच है। मैंने INVERSE_FUNCTION जोड़ने पर विचार किया लेकिन भ्रमित नहीं होना चाहता था। मैं इसे बदल दूंगा। – beach

7

इस जवाब में मुझे लगता है डेटाबेस पर्याप्त कवर अनुक्रमित है। this topic के बारे में पर्याप्त प्रश्न हैं।

कई बार एक क्वेरी की सरगमता संबंधित इंडेक्स के टिपिंग पॉइंट द्वारा निर्धारित की जाती है। टिपिंग प्वाइंट एक टेबल में शामिल होने के दौरान इंडेक्स की तलाश और स्कैनिंग के बीच अंतर को परिभाषित करता है या परिणाम दूसरे पर सेट होता है। एक पूरी टेबल स्कैन करने की तुलना में एक खोज निश्चित रूप से बहुत तेज है, लेकिन जब आपको बहुत सारी पंक्तियां तलाशनी होंगी, तो स्कैन अधिक समझ में आ सकता है।

तो अन्य चीजों के साथ एक एसक्यूएल कथन अधिक कारगर है जब अनुकूलक उम्मीद करता है कि एक तालिका की परिणामी पंक्तियों की संख्या अगले तालिका पर संभावित सूचकांक के टिपिंग पॉइंट से कम हो।

आप एक विस्तृत पोस्ट और उदाहरण here देख सकते हैं।

0

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

संबंधित मुद्दे