टेबल स्कैन और क्लस्टर्ड इंडेक्स स्कैन के बीच क्या अंतर है?


63

चूंकि Table Scan और Clustered Index Scan दोनों तालिका में सभी रिकॉर्ड स्कैन करते हैं, क्लस्टर्ड इंडेक्स स्कैन क्यों बेहतर रूप से बेहतर है?

एक उदाहरण के रूप - क्या निम्नलिखित जब वहाँ कई रिकॉर्ड ?:

declare @temp table(
    SomeColumn varchar(50) 
) 

insert into @temp 
select 'SomeVal' 

select * from @temp 

----------------------------- 

declare @temp table(
    RowID int not null identity(1,1) primary key, 
    SomeColumn varchar(50) 
) 

insert into @temp 
select 'SomeVal' 

select * from @temp 
70

क्लस्टर्ड इंडेक्स (एक ढेर तालिका) के बिना किसी तालिका में, डेटा पेज एक साथ जुड़े नहीं होते हैं - इसलिए ट्रैवर्सिंग पृष्ठों को lookup into the Index Allocation Map की आवश्यकता होती है।

एक क्लस्टर्ड टेबल, हालांकि, यह data pages linked in a doubly linked list है - अनुक्रमिक स्कैन थोड़ा तेज बनाता है। बेशक, बदले में, आपके पास INSERT, UPDATE, और DELETE पर डेटा पृष्ठों को रखने के साथ निपटने का ओवरहेड है। एक ढेर तालिका, हालांकि, आईएएम को एक दूसरा लिखना आवश्यक है।

आपकी क्वेरी एक RANGE ऑपरेटर (उदा .: SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100), तो एक क्लस्टर तालिका (एक गारंटीकृत क्रम में किया जा रहा है) और अधिक कुशल हो जाएगा है - के रूप में यह सूचकांक पृष्ठों इस्तेमाल कर सकते हैं प्रासंगिक डेटा पेज (रों) खोजने के लिए। एक ढेर को सभी पंक्तियों को स्कैन करना होगा, क्योंकि यह ऑर्डर करने पर भरोसा नहीं कर सकता है।

और, ज़ाहिर है, एक क्लस्टर इंडेक्स आपको क्लस्टरेड इंडेक्स सेक करने देता है, जो प्रदर्शन के लिए काफी अनुकूल है ... कोई इंडेक्स वाला एक ढेर हमेशा तालिका स्कैन में परिणाम देगा।

तो:

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

  • WHERE क्लॉज के साथ एक क्वेरी के लिए जो क्लस्टर्ड इंडेक्स द्वारा संतुष्ट (कम से कम आंशिक रूप से) हो सकता है, आप ऑर्डरिंग के कारण आगे आ जाएंगे - इसलिए आपको पूरी तालिका को स्कैन नहीं करना पड़ेगा।

  • क्लस्टर इंडेक्स द्वारा सब्सक्राइब किए गए एक प्रश्न के लिए, आप बहुत अधिक हैं ... फिर, अनुक्रमिक स्कैनिंग के लिए दोगुनी लिंक वाली एकमात्र अंतर है।किसी भी मामले में, आप उपमहाद्वीप हैं।

  • INSERT, UPDATE लिए

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

माइक्रोसॉफ्ट एक whitepaper जो एक ढेर (ठीक उसी नहीं के रूप में मैं ऊपर चर्चा की, लेकिन करीब) पर एक बराबर गैर क्लस्टर सूचकांक करने के लिए संकुल अनुक्रमणिका तुलना है। उनका निष्कर्ष मूल रूप से सभी तालिकाओं पर क्लस्टर्ड इंडेक्स डालना है। मैं उनके परिणाम को संक्षेप में प्रस्तुत करने के लिए अपने सर्वोत्तम प्रयास करेंगे (फिर से, ध्यान दें कि वे वास्तव में एक क्लस्टर सूचकांक यहाँ करने के लिए एक गैर क्लस्टर सूचकांक की तुलना कर रहे हैं - लेकिन मुझे लगता है कि यह अपेक्षाकृत तुलनीय है):

  • INSERT प्रदर्शन: क्लस्टर सूचकांक एक ढेर के लिए आवश्यक दूसरे लेखन के कारण लगभग 3% जीतता है।
  • UPDATE प्रदर्शन: एक ढेर के लिए आवश्यक दूसरे लुकअप के कारण क्लस्टर्ड इंडेक्स लगभग 8% तक जीत गया।
  • DELETE प्रदर्शन: दूसरे लुकअप की आवश्यकता के कारण क्लस्टर्ड इंडेक्स लगभग 18% तक पहुंच गया और आईएएम से ढेर के लिए दूसरी हटाई गई।
  • सिंगल SELECT प्रदर्शन: एक ढेर के लिए आवश्यक दूसरे लुकअप के कारण क्लस्टर्ड इंडेक्स लगभग 16% तक जीत गया।
  • रेंज SELECT प्रदर्शन: क्लस्टर सूचकांक एक ढेर के लिए यादृच्छिक क्रम के कारण लगभग 2 9% जीतता है।
  • समवर्ती INSERT: क्लस्टर सूचकांक के लिए पृष्ठ विभाजन के कारण हीप तालिका लोड के तहत 30% तक जीत जाती है।
+1

आज भी मेरे दिमाग में यह सवाल बुलबुला हुआ। यह पूछने के लिए @Terrapin धन्यवाद और @Marc को धन्यवाद देने के लिए धन्यवाद! 01 may. 112011-05-01 18:53:22

+1

एमएस परीक्षा 70461 माइक्रोसॉफ्ट एसक्यूएल सर्वर 2012 पूछताछ - अध्याय 15 पाठ 1 में गहन शोषण है। 13 jan. 152015-01-13 23:28:57

  0

मुझे आपके इस कथन द्वारा इंगित अनुमानित वृद्धि प्राप्त नहीं हो रही है: "क्लस्टर इंडेक्स द्वारा संतुष्ट (कम से कम आंशिक रूप से) हो सकता है, जहां आप आदेश के कारण आगे आ जाएंगे - इसलिए आपको पूरी तालिका को स्कैन नहीं करना पड़ेगा। " मेरे पास 10 मिलियन पंक्तियों की एक सारणी है। ग्राहक से आईडी चुनें जहां आईडी> एक्स उसी समय में निष्पादित करता है इससे कोई फर्क नहीं पड़ता कि मेरे पास आईडी पर क्लस्टर इंडेक्स है या नहीं। कैसे? मैं देख सकता हूं कि तालिका स्कैन से क्लस्टर्ड इंडेक्स स्कैन में यह कैसे बदलता है। 30 apr. 152015-04-30 07:17:40

+2

@MattiasNordqvist - यदि आप बस समय ले रहे हैं, तो आप इसे गलत कर रहे हैं। कैशिंग, समवर्ती पहुंच, सीपीयू बनाम डिस्क समय इत्यादि के कारण, अकेले समय पर एमएस-एसक्यूएल को प्रतिस्थापित करना मुश्किल है। अपनी डिस्क को पढ़ने के लिए एसईटी सांख्यिकी IO पर देखें, जहां से बढ़ावा मिलेगा। दूसरा, यह लौटाई गई पंक्तियों की संख्या पर निर्भर करेगा - यदि यह पर्याप्त प्रतिशत है, तो अनुकूलक इसके बजाय एक पढ़ने + फ़िल्टर को चुन सकता है। 30 apr. 152015-04-30 19:42:44


-2

एक तालिका स्कैन तालिका के हर एक पंक्ति जांच करने के लिए है रहे हैं के बीच प्रदर्शन अंतर है। क्लस्टर्ड इंडेक्स स्कैन केवल इंडेक्स को स्कैन करने की आवश्यकता है। यह तालिका में हर रिकॉर्ड स्कैन नहीं करता है। वास्तव में, संकेतों का मुद्दा है।

+7

-1 यह गलत है। क्लस्टर सूचकांक का पत्ता स्तर * तालिका है। 14 feb. 142014-02-14 19:05:25


4

http://msdn.microsoft.com/en-us/library/aa216840(SQL.80).aspx

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

http://msdn.microsoft.com/en-us/library/aa178416(SQL.80).aspx

तालिका स्कैन तार्किक और भौतिक ऑपरेटर तर्क स्तंभ में निर्दिष्ट तालिका वाली सभी पंक्तियां प्राप्त करता है। यदि कोई कहां है :() तर्क कॉलम कॉलम में प्रकट होता है, केवल उन्हीं पंक्तियां जो भविष्यवाणी को पूरा करती हैं, लौटा दी जाती हैं।