लघु संस्करण: तलाश ज्यादा बेहतर है
कम लघु संस्करण: तलाश आम तौर पर बहुत बेहतर है, लेकिन एक महान कई (उदाहरण के लिए बुरा सहसंबद्ध उप-प्रश्नों के साथ खराब क्वेरी डिजाइन के कारण, या क्योंकि आप कर्सर ऑपरेशन या अन्य लूप में कई प्रश्न बना रहे हैं) एक से भी बदतर हो सकते हैं स्कैन करें, खासकर अगर आपकी क्वेरी प्रभावित तालिका की अधिकांश पंक्तियों से डेटा लौटा सकती है।
यह डेटा परिवार के लिए पूरे परिवार को कवर करने में मदद करता है ताकि प्रदर्शन के निहितार्थ को पूरी तरह से समझ सकें।
तालिका स्कैन: आपकी क्वेरी के लिए प्रासंगिक सभी अनुक्रमित न होने के साथ, योजनाकार को टेबल स्कैन अर्थ का उपयोग करने के लिए मजबूर किया जाता है जिसका अर्थ है कि प्रत्येक पंक्ति को देखा जाता है। यह तालिका के डेटा से संबंधित हर पृष्ठ पर डिस्क से पढ़ा जा सकता है जो अक्सर सबसे खराब स्थिति होती है। ध्यान दें कि कुछ प्रश्नों के लिए यह तब भी एक टेबल स्कैन का उपयोग करेगा, जब एक उपयोगी सूचकांक मौजूद होता है - यह आमतौर पर होता है क्योंकि तालिका में डेटा इतना छोटा होता है कि यह अनुक्रमणिका को पार करने के लिए अधिक परेशानी वाला होता है (यदि यह मामला है तो आप अपेक्षा करेंगे) जैसे-जैसे डेटा बढ़ता है, इंडेक्स की चयनात्मकता मापता है, बदलने की योजना)।
इंडेक्स स्कैन्स विथ रो लुकअप: इंडेक्स विथ नो इंडेक्स जिसका उपयोग सीधे खोजा जा सकता है के लिए किया जाता है, लेकिन सही कॉलम वाले इंडेक्स में मौजूद इंडेक्स स्कैन का उपयोग किया जा सकता है। उदाहरण के लिए, यदि आपके पास कॉलम 1, कॉल 2, कॉल 3 पर एक सूचकांक के साथ 20 स्तंभों के साथ एक बड़ी तालिका है और आप जारी करते हैं SELECT col4 FROM exampletable WHERE col2=616
, तो इस मामले में सूचकांक को क्वेरी col2
पर स्कैन करना पूरी तालिका को स्कैन करने से बेहतर है। एक बार जब मिलान पंक्तियाँ मिल जाती हैं, तो डेटा पृष्ठों को आउटपुट (या आगे जुड़ने) के लिए पिकअप कॉल 4 में पढ़ने की आवश्यकता होती है, जो कि "बुकमार्क लुकअप" चरण है जब आप इसे क्वेरी योजनाओं में देखते हैं।
सूचकांक लुकअप के बिना सूचकांक स्कैन: यदि उपरोक्त उदाहरण था SELECT col1, col2, col3 FROM exampletable WHERE col2=616
तो डेटा पृष्ठों को पढ़ने के लिए अतिरिक्त प्रयास की आवश्यकता नहीं है: एक बार सूचकांक पंक्तियों के मिलान के बाद col2=616
सभी अनुरोधित डेटा ज्ञात हो जाते हैं। यही कारण है कि आप कभी-कभी ऐसे कॉलम देखते हैं जिन्हें कभी खोजा नहीं जाएगा, लेकिन आउटपुट के लिए अनुरोध किए जाने की संभावना है, इंडेक्स के अंत में जोड़ा गया - यह पंक्ति लुकअप को बचा सकता है। इस कारण और केवल इस कारण से एक इंडेक्स में कॉलम जोड़ते समय, उन्हें INCLUDE
यह बताने के लिए कि यह कॉलम के आधार पर क्वेरी के लिए इंडेक्स लेआउट को ऑप्टिमाइज़ करने की आवश्यकता नहीं है (यह उन कॉलम में किए गए अपडेट को गति दे सकता है) । इंडेक्स स्कैन बिना किसी फ़िल्टरिंग क्लॉज़ वाले प्रश्नों से हो सकता है: SELECT col2 FROM exampletable
टेबल पृष्ठों के बजाय इस उदाहरण इंडेक्स को स्कैन करेगा।
अनुक्रमणिका खोज (पंक्ति लुकअप के साथ या उसके बिना) : एक तलाश में सूचकांक के सभी नहीं माना जाता है। क्वेरी के SELECT * FROM exampletable WHERE c1 BETWEEN 1234 AND 4567
लिए क्वेरी इंजन पहली पंक्ति को खोज सकता है जो सूचकांक पर एक पेड़-आधारित खोज करके मेल खाएगा, c1
तब तक यह सूचकांक को क्रम में नेविगेट कर सकता है जब तक कि यह सीमा के अंत तक न हो (यह एक क्वेरी के साथ ऐसा ही है के c1=1234
रूप में वहाँ कई पंक्तियों के लिए एक =
ऑपरेशन के लिए भी स्थिति से मेल खाता हो सकता है )। इसका मतलब यह है कि केवल प्रासंगिक सूचकांक पृष्ठों (प्रारंभिक खोज के लिए कुछ आवश्यक) को सूचकांक (या तालिका) में प्रत्येक पृष्ठ के बजाय पढ़ने की आवश्यकता है।
क्लस्टर्ड इंडेक्स: एक क्लस्टर इंडेक्स के साथ टेबल डेटा को एक अलग हीप स्ट्रक्चर में होने के बजाय उस इंडेक्स के लीफ नोड्स में स्टोर किया जाता है। इसका मतलब यह है कि उस सूचकांक का उपयोग करके पंक्तियों को खोजने के बाद कभी भी कोई अतिरिक्त पंक्ति लुकअप होने की आवश्यकता नहीं होगी, चाहे स्तंभों की आवश्यकता हो [जब तक आपके पास ऑफ-पेज डेटा जैसे TEXT
स्तंभ या VARCHAR(MAX)
स्तंभ लंबा डेटा न हो]।
इस कारण से आपके पास केवल एक क्लस्टर इंडेक्स हो सकता है [1] , एक अलग ढेर संरचना होने के बजाय क्लस्टर इंडेक्स आपकी तालिका है, इसलिए यदि आप अधिकतम लाभ प्राप्त करने के लिए एक [2] का उपयोग करते हैं, जहां आपने इसे सावधानी से रखा है।
यह भी ध्यान दें कि तालिका के लिए "क्लस्टरिंग कुंजी" के कारण क्लस्टर इंडेक्स और टेबल पर प्रत्येक गैर-क्लस्टर इंडेक्स में शामिल है, इसलिए एक विस्तृत क्लस्टर इंडेक्स आमतौर पर एक अच्छा विचार नहीं है।
[१] वास्तव में, आप प्रभावी रूप से गैर-संकुलित अनुक्रमित को परिभाषित करके कई क्लस्टर अनुक्रमित कर सकते हैं जो तालिका के प्रत्येक स्तंभ को कवर या शामिल करते हैं, लेकिन इससे अंतरिक्ष की बर्बादी होने की संभावना है, लेखन प्रदर्शन प्रभाव पड़ता है इसलिए यदि आप इसे सुनिश्चित करने पर विचार करते हैं तुम सच में की जरूरत है
[२] जब मैं कहता हूं "यदि आप एक क्लस्टर इंडेक्स का उपयोग करते हैं", तो ध्यान दें कि आमतौर पर यह सिफारिश की जाती है कि आपके पास प्रत्येक टेबल पर एक है। सभी नियमों के साथ अपवाद हैं, तालिकाएँ जो थोक आवेषण और अनअॉर्डर रीड्स (ईटीएल प्रक्रियाओं के लिए स्टैगिंग टेबल) के अलावा सबसे आम काउंटर उदाहरण के रूप में बहुत कम देखते हैं।
अतिरिक्त बिंदु: अपूर्ण स्कैन:
यह याद रखना महत्वपूर्ण है कि क्वेरी के बाकी हिस्सों के आधार पर एक टेबल / इंडेक्स स्कैन वास्तव में पूरे टेबल को स्कैन नहीं कर सकता है - यदि तर्क की अनुमति देता है तो क्वेरी प्लान इसे जल्दी से गर्भपात करने में सक्षम हो सकता है। इसका सबसे सरल उदाहरण है SELECT TOP(1) * FROM HugeTable
- यदि आप इसके लिए क्वेरी योजना को देखते हैं, तो आप देखेंगे कि स्कैन से केवल एक पंक्ति लौटा दी गई थी और यदि आप IO आँकड़े SET STATISTICS IO ON; SELECT TOP(1) * FROM HugeTable
देखते हैं ( ) तो आप देखेंगे कि यह केवल एक बहुत छोटी संख्या को पढ़ता है पृष्ठों की (शायद सिर्फ एक)।
ऐसा ही हो सकता है यदि एक WHERE
या JOIN ... ON
क्लॉज़ का विधेय स्कैन के साथ समवर्ती रूप से चलाया जा सकता है जो कि स्रोत है यदि उसका डेटा। क्वेरी प्लानर / रनर कभी-कभी इस तरह से स्कैन को जल्दी समाप्त करने की अनुमति देने के लिए डेटा स्रोतों की ओर आगे बढ़ने पर जोर देने के बारे में बहुत चालाक हो सकता है (और कभी-कभी आप ऐसा करने में मदद करने के लिए प्रश्नों को पुन: व्यवस्थित करने में चतुर हो सकते हैं!)। हालांकि डेटा मानक क्वेरी योजना प्रदर्शन में तीर के अनुसार दाएं-से-बाएं प्रवाहित होता है, तर्क बाएं से दाएं चलता है और अगला शुरू होने से पहले पूरा करने के लिए प्रत्येक चरण (दाएं-से-बाएं) जरूरी नहीं है। यदि आप एक एजेंट के रूप क्वेरी योजना में प्रत्येक ब्लॉक को देखो ऊपर सरल उदाहरण में SELECT
एजेंट पूछता है TOP
एक पंक्ति है जो बदले में पूछता है के लिए एजेंटTABLE SCAN
एक के लिए एजेंट, फिर SELECT
एजेंट दूसरे के लिए पूछता है, लेकिन TOP
एजेंट जानता है कि कोई ज़रूरत नहीं है टेबल रीडर से भी पूछने की जहमत नहीं उठती है, SELECT
एजेंट को "कोई और अधिक प्रासंगिक" प्रतिक्रिया नहीं मिलती है और जानता है कि सभी काम पूरा हो गया है। कई ऑपरेशन इस तरह के अनुकूलन को रोकते हैं, इसलिए अक्सर अधिक जटिल उदाहरणों में एक तालिका / सूचकांक स्कैन वास्तव में हर पंक्ति को पढ़ता है, लेकिन इस निष्कर्ष पर कूदने के लिए सावधान रहें कि कोई भी स्कैन एक महंगा ऑपरेशन होना चाहिए।