10

आमतौर पर क्लस्टरर्ड इंडेक्स प्राथमिक कुंजी सेट करके SQL सर्वर प्रबंधन स्टूडियो में बनाया गया है, हालांकि पीके < -> क्लस्टर्ड इंडेक्स (Meaning of Primary Key to Microsoft SQL Server 2008) के बारे में मेरा हालिया प्रश्न दिखाया गया है कि पीके और क्लस्टरर्ड इंडेक्स को बराबर होना आवश्यक नहीं है।SQL सर्वर में क्लस्टर्ड इंडेक्स का चयन कैसे करें?

तो हमें क्लस्टर्ड इंडेक्स को कैसे चुनना चाहिए? चलो निम्न उदाहरण है:

बनाने तालिका ग्राहकों (आईडी int, ...) तालिका आदेश (आईडी int, CustomerID पूर्णांक)

हम आम तौर पर दोनों आईडी कॉलम लेकिन मैं पर पी/सीआई पैदा करेगा बनाने ग्राहक आईडी में ऑर्डर के लिए इसे बनाने के बारे में सोचा। क्या यह सबसे अच्छा विकल्प है?

+0

[SQL सर्वर - क्लस्टर्ड बनाम गैर क्लस्टर इंडेक्स का उपयोग कब करें?] का संभावित डुप्लिकेट? (Https://stackoverflow.com/questions/18304376/sql-server-when-to-use-clustered-vs-non- क्लस्टर-इंडेक्स) –

उत्तर

11

के अनुसार अनुक्रमण की रानी - किम्बर्ली ट्रिप - क्या वह संकुल अनुक्रमणिका में के लिए लग रहा है मुख्य रूप से है:

  • अनोखा
  • संकीर्ण
  • स्टेटिक

और अगर आप यह भी गारंटी दे सकते हैं:

  • कभी-कभी बढ़ते पैटर्न

तो आप अपनी आदर्श क्लस्टरिंग कुंजी रखने के बहुत करीब हैं!

उसके पूरे blog post here देखें, और यहां तालिका संचालन पर महत्वपूर्ण प्रभावों को क्लस्टर करने के बारे में एक और वास्तव में दिलचस्प है: The Clustered Index Debate Continues

आईएनटी (एसएसपी। एक आईएनटी पहचान) या संभवतः एक आईएनटी और डेटेटिम जैसी कुछ भी आदर्श कैंडीएट हैं। अन्य कारणों से, GUID अच्छे उम्मीदवार नहीं हैं - इसलिए आपके पास अपने पीके के रूप में एक GUID हो सकता है, लेकिन उस पर अपनी तालिका क्लस्टर न करें - इसे मान्यता से परे खंडित किया जाएगा और प्रदर्शन भुगतना होगा।

+0

क्या ये ब्लॉग पोस्ट अभी भी SQL सर्वर के नए संस्करणों के लिए प्रासंगिक हैं, या SQL Server 2008 में हालिया प्रदर्शन tweaks है और बाद में किसी भी तरह से सर्वोत्तम प्रथाओं को बदल दिया है? –

+0

@AdrianGrigore: जब तक आप "सामान्य" टेबल (उदा। डाटावायरहाउस/कॉलमस्टोर सामान नहीं) का उपयोग करते हैं, तब तक सब कुछ वैध है, –

+0

ग्रेट, धन्यवाद! :) –

1

यदि आप क्लस्टरिंग के बारे में चिंतित हैं तो यह आमतौर पर डेटा पुनर्प्राप्ति में सुधार करने में मदद करता है। उदाहरण में, आप शायद किसी दिए गए ग्राहक के लिए सभी रिकॉर्ड एक बार में चाहते हैं। ग्राहक आईडी पर क्लस्टरिंग उन पंक्तियों को आपकी फ़ाइल में कई पृष्ठों में बिखरे हुए बजाय एक ही भौतिक पृष्ठ पर रखेगी।

आरओटी: आप जिस संग्रह को दिखाना चाहते हैं उस पर क्लस्टर करें। खरीद आदेश में लाइन आइटम क्लासिक उदाहरण है।

+0

पीओ पर लाइन आइटम क्लस्टर के लिए अच्छा विचार हो सकता है, लेकिन यदि सामान्य क्रम पर केवल 2 या 3 (या एक दर्जन) लाइन आइटम नहीं हैं। जब तक आप जिन पंक्तियों को एक साथ क्लस्टरिंग नहीं कर रहे हैं, वे दर्जनों या सैकड़ों में शामिल होने लगते हैं, तो SQL सर्वर को बुकमार्क लुकअप करने के लिए बस बेहतर है। मेरे पास एक प्रणाली थी जहां किसी विशेष कैशियर की शिफ्ट के दौरान हुई सभी "लाइन आइटम" को व्यवसाय आवश्यकता को ढूंढना था (यह देखने के लिए कि क्या वे संतुलित हैं)। ** आईडी ** के साथ "लाइन आइटम" को डीमोरमाइज करना, यदि ** शिफ्ट **, और फिर ** शिफ्ट ** पर क्लस्टरिंग एक बड़ी गति वृद्धि थी। –

6

CLUSTERED अनुक्रमणिका के लिए सबसे अच्छा उम्मीदवार वह कुंजी है जिसका उपयोग आप अपने रिकॉर्ड को अक्सर संदर्भित करने के लिए करते हैं।

आमतौर पर, यह PRIMARY KEY है, क्योंकि यह खोजों और/या FOREIGN KEY संबंधों में उपयोग किया जाता है।

आपके मामले में, Orders.ID शायद खोज और संदर्भों में भाग लेगा, इसलिए यह क्लस्टरिंग अभिव्यक्ति होने के लिए सबसे अच्छा उम्मीदवार है।

आप Orders.CustomerID पर CLUSTERED सूचकांक बनाते हैं, तो निम्न चीज़ें होंगी:

  1. CustomerID अद्वितीय नहीं है। विशिष्टता सुनिश्चित करने के लिए, एक विशेष छिपा 32-bit कॉलम uniquifier के रूप में जाना जाता है प्रत्येक रिकॉर्ड में जोड़ा जाएगा। तालिका में

  2. रिकॉर्ड्स कॉलम (CustomerID, uniquifier) की यह जोड़ी के अनुसार संग्रहीत किया जाएगा।

  3. Order.ID पर एक माध्यमिक सूचकांक (CustomerID, uniquifier) के साथ रिकॉर्ड पॉइंटर्स के रूप में बनाया जाएगा।

  4. प्रश्नों इस तरह: के बाद से नहीं सभी स्तंभों ID पर सूचकांक में जमा हो जाती है

    SELECT * 
    FROM Orders 
    WHERE ID = 1234567 
    

    , एक बाहरी आपरेशन, एक Clustered Seek करना होगा। सभी कॉलम पुनर्प्राप्त करने के लिए, रिकॉर्ड पहले क्लस्टर टेबल में स्थित होना चाहिए।

इस अतिरिक्त आपरेशन, अपनी तालिका में रिकॉर्ड की कुल संख्या का IndexDepth beign O(log(n))IndexDepth के रूप में कई पेज एक सरल Clustered Seek रूप में पढ़ता है की आवश्यकता है।

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