2009-01-20 19 views
83

कहें कि मेरे पास प्राथमिक कुंजी के रूप में डेटाबेस सेट में एक आईडी पंक्ति (int) है। यदि मैं अक्सर आईडी से पूछताछ करता हूं तो मुझे इसे अनुक्रमित करने की भी आवश्यकता होती है? या यह प्राथमिक कुंजी होने का मतलब है कि यह पहले ही अनुक्रमित है?एसक्यूएल प्राथमिक कुंजी और सूचकांक

कारण मैं पूछता हूं क्योंकि एमएस एसक्यूएल सर्वर में मैं इस आईडी पर एक इंडेक्स बना सकता हूं, जैसा कि मैंने कहा है मेरी प्राथमिक कुंजी है।

संपादित करें: एक अतिरिक्त प्रश्न - क्या यह प्राथमिक कुंजी को अतिरिक्त रूप से इंडेक्स करने के लिए कोई नुकसान होगा?

उत्तर

58

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

अतिरिक्त अनुक्रमणिका कोई अच्छा नहीं है, लेकिन एकमात्र नुकसान (बहुत छोटा) अतिरिक्त फ़ाइल आकार और पंक्ति-निर्माण ओवरहेड है।

+27

अप्रयुक्त इंडेक्स का नुकसान वास्तव में बहुत हानिकारक है। एक बात के लिए, इंडेक्स भंडारण खाते हैं। एक और बात के लिए, यह लिखता है और अद्यतन धीमा करता है। उन इंडेक्स को हमेशा हटाएं जिनका उपयोग नहीं किया जा रहा है। – Pacerier

0

प्राथमिक कुंजी स्वचालित रूप से

इंडेक्स किए गए आप अपने उपयोग

  • सूचकांक ZIP_CODE के आधार पर पी का उपयोग कर, आईडी सहायक हो सकता है अतिरिक्त सूचकांक बना सकते हैं अगर आप अक्सर ZIP_CODE और आईडी
द्वारा चयन
16

प्राथमिक कुंजी हमेशा डिफ़ॉल्ट रूप से अनुक्रमित की जाती हैं।

आप SQL सर्वर प्रबंधन स्टूडियो या ट्रांजैक्ट-एसक्यूएल का उपयोग कर SQL Server 2012 में प्राथमिक कुंजी को परिभाषित कर सकते हैं। एक प्राथमिक कुंजी बनाना स्वचालित रूप से एक अद्वितीय अद्वितीय, क्लस्टर या nonclustered सूचकांक बनाता है।

http://technet.microsoft.com/en-us/library/ms189039.aspx

0

मुझे कोई (अलग) सूचकांक के साथ एक विशाल डेटाबेस है।

जब भी मैं प्राथमिक कुंजी से पूछता हूं तो परिणाम सभी गहन उद्देश्यों के लिए तत्काल होते हैं।

+0

ऐसा इसलिए है क्योंकि पीके एक क्लस्टर इंडेक्स है, अपनी क्वेरी प्लान – SQLMenace

+1

देखें यदि कुछ गलत हो तो मैं क्वेरी प्लान देखूंगा। – Grant

7

एक पी एक क्लस्टर सूचकांक जब तक आप गैर क्लस्टर

2

यह एक प्राथमिक कुंजी भी अपने आप उसके लिए एक सूचकांक बनाना चाहिए बनाना निर्दिष्ट बन जाएगा।

7

यहाँ MSDN से पारित होने के:

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

41

जैसा कि सभी ने पहले ही कहा है, प्राथमिक कुंजी स्वचालित रूप से अनुक्रमित की जाती हैं।

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

उदाहरण के लिए आपके पास कई कॉलम वाली एक तालिका है लेकिन आप केवल आईडी, नाम और पता कॉलम से पूछताछ कर रहे हैं। प्राथमिक कुंजी के रूप में आईडी लेते हुए, हम आईडी पर बनाए गए निम्न इंडेक्स को बना सकते हैं लेकिन नाम और पता कॉलम शामिल हैं।

CREATE NONCLUSTERED INDEX MyIndex 
ON MyTable(ID) 
INCLUDE (Name, Address) 

इसलिए, जब आप इस क्वेरी का उपयोग करें:

SELECT ID, Name, Address FROM MyTable WHERE ID > 1000 

एसक्यूएल सर्वर आप परिणाम केवल सूचकांक आपके द्वारा बनाया गया का उपयोग कर दे देंगे और यह वास्तविक मेज से कुछ भी नहीं पढ़ा होगा।

24

नोट: यह उत्तर एंटरप्राइज़-क्लास विकास को बड़े में संबोधित करता है।

यह एक आरडीबीएमएस मुद्दा है, न केवल SQL सर्वर, और व्यवहार बहुत दिलचस्प हो सकता है। एक के लिए, प्राथमिक कुंजी के लिए स्वचालित रूप से अनुक्रमित होने के लिए यह सामान्य है (विशिष्ट रूप से), यह पूर्ण नहीं है। ऐसे समय होते हैं जब प्राथमिक कुंजी को विशिष्ट रूप से अनुक्रमित नहीं किया जाता है।

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

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

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

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

+1

वाह। दिलचस्प टिप्पणी/काम। – Ryan

+0

(दिमाग == उड़ा) – quillbreaker

+0

क्या होगा यदि कुंजी एक int या bigint autoincrement कुंजी है? एसक्यूएल सर्वर इस मामले में एक अद्वितीय इंडेक्स स्कैन नहीं करने के लिए पर्याप्त स्मार्ट है? – quillbreaker

1

ठीक है SQL सर्वर में, आमतौर पर, प्राथमिक कुंजी स्वचालित रूप से अनुक्रमित होती है। यह सच है, लेकिन यह तेजी से क्वेरी की गारंटी नहीं है। प्राथमिक कुंजी आपको प्राथमिक प्रदर्शन के रूप में केवल 1 फ़ील्ड होने पर उत्कृष्ट प्रदर्शन प्रदान करेगी। लेकिन, जब प्राथमिक कुंजी के रूप में कई फ़ील्ड होते हैं, तो अनुक्रमणिका उन फ़ील्ड पर आधारित होती है।

उदाहरण के लिए: फ़ील्ड A, B, C प्राथमिक कुंजी है, इस प्रकार जब आप अपने कहां खंड में उन 3 क्षेत्रों के आधार पर क्वेरी करते हैं, प्रदर्शन, अच्छा है लेकिन आप केवल सी क्षेत्र के साथ क्वेरी करना चाहते हैं जब जहां क्लाउड में, आपको अच्छा प्रदर्शन नहीं मिलेगा। इस प्रकार, अपना प्रदर्शन प्राप्त करने और चलाने के लिए, आपको मैन्युअल रूप से सी फ़ील्ड को अनुक्रमणित करने की आवश्यकता होगी।

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

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