अलग-अलग सिंटैक्स का उपयोग करके क्वेरी को व्यक्त करना कभी-कभी ऑप्टिमाइज़र को गैर-संकुल सूचकांक का उपयोग करने की आपकी इच्छा को संवाद करने में मदद कर सकता है। आपको नीचे दिए गए फॉर्म को ढूंढना चाहिए जो आप चाहते हैं:
SELECT
[ID],
[DeviceID],
[IsPUp],
[IsWebUp],
[IsPingUp],
[DateEntered]
FROM [dbo].[Heartbeats]
WHERE
[ID] IN
(
-- Keys
SELECT TOP (1000)
[ID]
FROM [dbo].[Heartbeats]
WHERE
[DateEntered] >= CONVERT(datetime, '2011-08-30', 121)
AND [DateEntered] < CONVERT(datetime, '2011-08-31', 121)
);
जब गैर-संकुल सूचकांक को संकेत के साथ मजबूर किया जाता है, तो उस योजना की तुलना करें:
SELECT TOP (1000)
*
FROM [dbo].[Heartbeats] WITH (INDEX(CommonQueryIndex))
WHERE
[DateEntered] BETWEEN '2011-08-30' and '2011-08-31';
योजनाएं अनिवार्य रूप से समान हैं (एक कुंजी लुकअप, क्लस्टर इंडेक्स पर तलाश से ज्यादा कुछ नहीं है)। दोनों योजना फॉर्म केवल कभी-कभी गैर-संकुलित सूचकांक पर एक की तलाश करेंगे और अधिकतम 1000 अनुक्रमणिका को संकुल सूचकांक में प्रदर्शित करेंगे।
महत्वपूर्ण अंतर शीर्ष ऑपरेटर की स्थिति में है। दो सीकों के बीच स्थित, शीर्ष ऑप्टिमाइज़र को क्लस्टर इंडेक्स के तार्किक-समतुल्य स्कैन के साथ दो मांगने वाले संचालन को बदलने से रोकता है। ऑप्टिमाइज़र समतुल्य रिलेशनल ऑपरेशंस के साथ लॉजिकल प्लान के कुछ हिस्सों को बदलकर काम करता है। शीर्ष एक संबंधपरक ऑपरेटर नहीं है, इसलिए पुनर्लेखन एक संकुल सूचकांक स्कैन में परिवर्तन को रोकता है। यदि ऑप्टिमाइज़र शीर्ष ऑपरेटर को पुन: भेजने में सक्षम था, तो यह अभी भी चाहत + तलाश पर स्कैन को तरजीह देगा क्योंकि लागत के आकलन के काम करने के तरीके।
स्कैन और कांटे की लागत
एक बहुत ही उच्च स्तर पर, स्कैन और स्पेक्स के लिए ऑप्टिमाइज़र की लागत मॉडल काफी सरल है: यह अनुमान है कि एक स्कैन में 1350 पृष्ठों को पढ़ने के रूप में 320 यादृच्छिक सीक्स की लागत है । यह शायद किसी विशेष आधुनिक I / O सिस्टम की हार्डवेयर क्षमताओं से कम समानता रखता है, लेकिन यह व्यावहारिक मॉडल के रूप में यथोचित काम करता है।
मॉडल भी कई सरल मान्यताओं को बनाता है, एक प्रमुख यह है कि हर क्वेरी को बिना किसी डेटा या इंडेक्स पेज के कैश में शुरू करने के लिए शुरू किया जाता है। निहितार्थ यह है कि प्रत्येक I / O का परिणाम शारीरिक I / O होगा - हालांकि यह शायद ही कभी व्यवहार में होगा। यहां तक कि एक ठंडा कैश के साथ, पूर्व-लाने और पढ़ने-आगे का मतलब है कि जिन पृष्ठों की आवश्यकता होती है, वे वास्तव में स्मृति में होने की संभावना रखते हैं जब तक कि क्वेरी प्रोसेसर को उनकी आवश्यकता होती है।
एक और विचार यह है कि एक पंक्ति के लिए पहला अनुरोध जो मेमोरी में नहीं है, पूरे पृष्ठ को डिस्क से लाने का कारण होगा। एक ही पृष्ठ पर पंक्तियों के लिए अनुवर्ती अनुरोधों से शारीरिक I / O की संभावना नहीं होगी। कॉस्टिंग मॉडल में इस तरह के कुछ प्रभावों को लेने के लिए तर्क होते हैं, लेकिन यह सही नहीं है।
इन सभी चीजों (और अधिक) का मतलब है कि ऑप्टिमाइज़र शायद पहले की तुलना में स्कैन पर स्विच करना चाहता है। यादृच्छिक I / O केवल 'अनुक्रमिक' I / O की तुलना में 'बहुत अधिक महंगा' है अगर एक भौतिक ऑपरेशन परिणाम - स्मृति में पृष्ठों तक पहुंचना वास्तव में बहुत तेज है। यहां तक कि जहां एक शारीरिक रीड की आवश्यकता होती है, स्कैन विखंडन के कारण अनुक्रमिक रीड में बिल्कुल भी परिणाम नहीं हो सकता है, और सीक को इस तरह से ढोया जा सकता है कि पैटर्न अनिवार्य रूप से अनुक्रमिक है। आधुनिक I / O प्रणालियों (विशेष रूप से ठोस-अवस्था) की बदलती प्रदर्शन विशेषता और संपूर्ण चीज़ बहुत ही अस्थिर लगने लगती है।
रो गोल
एक योजना में एक शीर्ष ऑपरेटर की उपस्थिति लागत दृष्टिकोण को संशोधित करती है। ऑप्टिमाइज़र यह जानने के लिए पर्याप्त स्मार्ट है कि स्कैन का उपयोग करके 1000 पंक्तियों को खोजने के लिए पूरे क्लस्टर इंडेक्स को स्कैन करने की आवश्यकता नहीं होगी - जैसे ही 1000 पंक्तियाँ मिली हैं, इसे रोक सकते हैं। यह शीर्ष ऑपरेटर पर 1000 पंक्तियों का एक 'पंक्ति लक्ष्य' निर्धारित करता है और यह अनुमान लगाने के लिए सांख्यिकीय जानकारी का उपयोग करता है कि पंक्ति स्रोत (इस मामले में एक स्कैन) से कितनी पंक्तियों की आवश्यकता है। मैंने इस गणना के विवरण के बारे में यहां लिखा है ।
इस उत्तर में छवियां SQL संतरी योजना एक्सप्लोरर का उपयोग करके बनाई गई थीं ।