Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

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

बिना संकुल अनुक्रमणिका (हीप तालिका) वाली तालिका में, डेटा पृष्ठ एक साथ लिंक नहीं होते हैं - इसलिए ट्रैवर्सिंग पृष्ठों के लिए एक सूचकांक आवंटन मानचित्र में देखें

हालाँकि, एक संकुल तालिका में यह डेटा पृष्ठ डबल लिंक्ड सूची में लिंक किया गया है - अनुक्रमिक स्कैन को थोड़ा तेज करना। बेशक, बदले में, आपके पास INSERT पर डेटा पृष्ठों को क्रम में रखने से निपटने का ओवरहेड है , UPDATE , और DELETE . हालाँकि, एक हीप तालिका के लिए IAM को दूसरी बार लिखने की आवश्यकता होती है।

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

और, निश्चित रूप से, एक संकुल अनुक्रमणिका आपको एक CLUSTERED INDEX SEEK करने देती है, जो प्रदर्शन के लिए बहुत अधिक इष्टतम है ... बिना अनुक्रमणिका वाले ढेर का परिणाम हमेशा एक टेबल स्कैन में होगा।

तो:

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

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

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

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

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

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर दो पूर्णांकों को विभाजित करने के परिणामों को बंद क्यों करता है?

  2. SQL सर्वर 2008:TOP 10 और एक साथ अलग

  3. निश्चित अंतराल में विशिष्ट यादृच्छिक समय पीढ़ी

  4. java.lang.ClassNotFoundException:com.microsoft.jdbc.sqlserver.SQLServerDriver:क्या मैं सही ड्राइवर लोड कर रहा हूँ?

  5. जहां खंड के साथ मूल्यों में डालें