2009-05-01 12 views
7

मेरे पास कुछ तालिकाओं पर कई अनुक्रमणिका हैं, वे सभी समान हैं और मैं जानना चाहता हूं कि क्लस्टरर्ड इंडेक्स सही कॉलम पर है या नहीं। यहाँ दो सबसे सक्रिय अनुक्रमित से आँकड़े हैं:एसक्यूएल सर्वर इंडेक्स जो क्लस्टर किया जाना चाहिए?

Nonclustered 
I3_Identity (bigint) 
rows: 193,781 
pages: 3821 
MB: 29.85 
user seeks: 463,355 
user_scans: 784 
user_lookups: 0 
updates: 256,516 

Clustered Primary Key 
I3_RowId (varchar(80)) 
rows: 193,781 
pages: 24,289 
MB: 189.76 
user_seeks: 2,473,413 
user_scans: 958 
user_lookups: 463,693 
updates: 2,669,261 

आप देख सकते हैं, पीके अक्सर ढूंढा जा रहा है, लेकिन सभी i3_identity स्तंभ के लिए करना चाहता है कुंजी लुकअप इस रूप में अच्छी तरह पी करने के लिए कर रहे हैं, इसलिए कर रहा हूँ मैं वास्तव में I3_Identity पर सूचकांक से बहुत लाभान्वित हूं? क्या मुझे क्लस्टर के रूप में I3_Identity का उपयोग करने के लिए बदलना चाहिए? इसका एक बड़ा प्रभाव हो सकता है क्योंकि इस टेबल संरचना को 10000 बार दोहराया जाता है जहां मैं काम करता हूं, इसलिए किसी भी मदद की सराहना की जाएगी।

उत्तर

8

फ्रेडरिक इसे अच्छी तरह से बताता है, और यह वास्तव में किम्बर्ली ट्रिप भी उपदेश देता है: क्लस्टरिंग कुंजी स्थिर होना चाहिए (कभी नहीं बदलती), कभी भी बढ़ती (पहचान आईएनटी), छोटी और अद्वितीय।

आपके परिदृश्य में, मैं VARCHAR (80) कॉलम की बजाय बिगिनट कॉलम पर क्लस्टरिंग कुंजी डालूंगा।

सबसे पहले, बिगिनट कॉलम के साथ, विशिष्टता को लागू करने के लिए यह काफी आसान है (यदि आप अपने आप को विशिष्टता को लागू नहीं करते हैं और गारंटी देते हैं, तो SQL सर्वर आपकी प्रत्येक पंक्ति में 4-बाइट "अद्वितीयफियर" जोड़ देगा) और यह एक VARCHAR (80) से औसत पर बहुत छोटा है।

आकार इतना महत्वपूर्ण क्यों है? क्लस्टरिंग कुंजी को प्रत्येक और आपके गैर-क्लस्टर इंडेक्स में से प्रत्येक में भी जोड़ा जाएगा - इसलिए यदि आपके पास बहुत सी पंक्तियां हैं और बहुत से गैर-क्लस्टर इंडेक्स हैं, तो 40-80 बाइट बनाम 8 बाइट होने से जल्दी ही एक बड़ा हो सकता है अंतर।

इसके अलावा, एक अन्य प्रदर्शन युक्ति: तथाकथित बुकमार्क लुकअप से बचने के लिए (वास्तविक डेटा लीफ पृष्ठों में क्लस्टरिंग कुंजी के माध्यम से आपके गैर-क्लस्टर्ड इंडेक्स में एक मान से), SQL Server 2005 ने धारणा पेश की है आपके गैर-क्लस्टर इंडेक्स में "कॉलम शामिल"। वे बेहद सहायक हैं, और अक्सर अनदेखा होते हैं। यदि आपके प्रश्नों को अक्सर इंडेक्स फ़ील्ड्स और डेटाबेस से केवल एक या दो अन्य फ़ील्ड की आवश्यकता होती है, तो "कवर इंडेक्स" कहलाए जाने के लिए उन लोगों को शामिल करने पर विचार करें। दोबारा - किम्बर्ली ट्रिप के उत्कृष्ट लेख को देखें - वह एसक्यूएल सर्वर इंडेक्सिंग देवी है! :-) और वह समझा सकती है कि मैं इससे ज्यादा बेहतर चीजें कर सकता हूं ...

तो इसे समेटने के लिए: अपनी क्लस्टरिंग कुंजी को एक छोटे, स्थिर, अद्वितीय कॉलम पर रखें - और आप बस ठीक करेंगे!

मार्क

2

जो मैंने पहले पढ़ा है, उससे अनुक्रमण तालिकाओं के संबंध में दो सबसे महत्वपूर्ण उपाय इंडेक्स और इंडेक्स घनत्व के खिलाफ किए गए प्रश्नों की संख्या हैं। डीबीसीसी_SHOWSTATISTICS ([तालिका], [सूचकांक]) का उपयोग करके, आप सूचकांक घनत्व की जांच कर सकते हैं। विचार यह है कि आप अपने क्लस्टर इंडेक्स को कॉलम पर चाहते हैं जो प्रति क्वेरी सबसे अधिक विशिष्टता प्रदान करते हैं।

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

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

संपादित करें : एमएसडीएन पर एक बहुत अच्छा लेख है जो बताता है कि SHOW_STATISTICS आपको क्या प्रदान करता है। http://msdn.microsoft.com/en-us/library/ms174384.aspx

3

Here's the best discussion मैं विषय के बारे में मिल गया है: मैं निश्चित रूप से एक uber डीबीए नहीं कर रहा हूँ, लेकिन जानकारी मैं यहाँ प्रदान की है के सबसे हमारे डीबीए :)

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

संकेत: आप पाएंगे कि संक्षिप्त उत्तर लगभग हमेशा सरल होते हैं।

5

त्वरित 'एन गंदा:

पर क्लस्टर सूचकांक रखो:

  • एक स्तंभ जो मान है (लगभग) कभी नहीं

  • एक स्तंभ है जिसके लिए नए रिकॉर्ड वृद्धि पर महत्व देता है/ क्रमशः

  • एक कॉलम जहां आप रेंज करते हैं - खोज

2

आम तौर पर, जब मैं PrimaryKey/क्लस्टर कुंजी की कुंजी लुकअप देखते हैं, यह मैं (वे बयान का उपयोग करके) गैर क्लस्टर कुंजी में अधिक कॉलम शामिल करने की जरूरत का मतलब है। अपने प्रश्नों को देखें और देखें कि उन कथनों में कौन से कॉलम का चयन/उपयोग किया जा रहा है। यदि आप उन कॉलम को गैर-क्लस्टर कुंजी में शामिल करते हैं, तो उसे अब कुंजी लुकअप करने की आवश्यकता नहीं होगी।

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