प्राथमिक कुंजी और क्लस्टर इंडेक्स का संबंध


91

क्या ए TABLE गुच्छेदार सूचकांक के बिना एक प्राथमिक कुंजी हो सकती है?

और TABLEएक प्राथमिक कुंजी के बिना एक संकुल सूचकांक हो सकता है?

क्या कोई मुझे प्राथमिक कुंजी और क्लस्टर इंडेक्स के बीच का संबंध बता सकता है?

जवाबों:


102

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

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

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

हां, आप उन स्तंभों पर एक संकुल सूचकांक बना सकते हैं जो प्राथमिक कुंजी नहीं हैं।


1
नमस्ते। विषय पुराना है, लेकिन शायद कोई मेरे सवाल का जवाब दे सकता है। यदि स्तंभ को पूर्ण अद्वितीय घोषित नहीं किया गया है, तो क्या यह प्राथमिक कुंजी प्रदर्शन या किसी भी चीज़ पर कोई वास्तविक परिवर्तन करेगा?
जेसी

यह एक दिलचस्प सवाल है। मैं नहीं मानूंगा, क्योंकि इसे सभी तरह से एक ही जांच करनी है।
जोनाथन एलन

शानदार जवाब।
निकोसवी

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

34

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

एक संकुल सूचकांक पत्ती स्तर पर सभी स्तंभों को संग्रहीत करता है। इसका मतलब है कि एक संकुल सूचकांक तालिका में सभी डेटा समाहित करता है। बिना संकुल सूचकांक वाली तालिका को ढेर कहा जाता है।

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

एक उदाहरण, जहां t1एक गैर-प्राथमिक प्राथमिक कुंजी है, और t2जिसका क्लस्टर नहीं है , लेकिन एक प्राथमिक कुंजी है:

create table t1 (id int not null, col1 int);
alter table t1 add constraint PK_T1 primary key nonclustered (id);
create clustered index IX_T1_COL1 on t1 (col1);

create table t2 (id int not null, col1 int);
alter table t2 add constraint PK_T2 primary key nonclustered (id);

SQL फिडेल पर उदाहरण।


19

सबसे पहले, इंडेक्स-ऑर्गनाइज्ड टेबल्स और क्लस्टर्ड इंडेक्स पर एक नज़र डालें । वास्तव में, मैं पूरी तरह से सूचकांक ल्यूक का उपयोग करने की सलाह देता हूं ! शुरू से साइट जब तक आप क्लस्टरिंग विषय तक पहुंचने के लिए वास्तव में समझने के लिए कि क्या चल रहा है।

अब, आपके प्रश्नों के लिए ...


क्या TABLE के पास Clustered Index के बिना प्राथमिक कुंजी हो सकती है?

हाँ, ढेर-आधारित तालिका बनाने के लिए अपनी प्राथमिक कुंजी घोषित करते समय NONCLUSTERED कीवर्ड का उपयोग करें। उदाहरण के लिए:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY NONCLUSTERED
    -- Other fields...
);

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


और प्राथमिक कुंजी के बिना एक सारणी में क्लस्टर सूचकांक हो सकता है?

कुछ अन्य DBMSes के विपरीत, MS SQL सर्वर आपको एक क्लस्टरिंग इंडेक्स देगा जो प्राथमिक कुंजी से अलग है, या यहां तक ​​कि प्राथमिक कुंजी के बिना बिल्कुल भी नहीं है।

निम्न उदाहरण पीके से अलग एक क्लस्टरिंग इंडेक्स बनाता है, जिसके शीर्ष पर एक UNIQUE बाधा है, जो कि आप ज्यादातर मामलों में चाहते हैं:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY,
    YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED
    -- Other fields...
);

यदि आप एक गैर-अद्वितीय क्लस्टरिंग इंडेक्स (का उपयोग करके CREATE CLUSTERED INDEX ...) चुनते हैं , तो एमएस SQL ​​सर्वर स्वचालित रूप से इसे एक छिपे हुए फ़ील्ड को जोड़कर अद्वितीय बना देगा।

कृपया ध्यान दें कि श्रेणी स्कैन के लिए क्लस्टरिंग के लाभ सबसे अधिक दिखाई देते हैं। यदि आप एक क्लस्टरिंग इंडेक्स का उपयोग करते हैं जो आपके क्लाइंट एप्लिकेशन द्वारा किए गए रेंज स्कैन के साथ "संरेखित" नहीं करता है (जैसे कि जब ऊपर उल्लिखित छिपे हुए कॉलम पर निर्भर हो, या एक सरोगेट कुंजी पर क्लस्टरिंग हो ), तो आप बहुत अधिक हैं क्लस्टरिंग के उद्देश्य को पराजित करना।


क्या कोई मुझे संक्षेप में प्राथमिक कुंजी और क्लस्टर इंडेक्स के संबंध बता सकता है?

MS SQL सर्वर के तहत, प्राथमिक कुंजी भी डिफ़ॉल्ट रूप से क्लस्टर की जाती है । जैसा कि ऊपर चर्चा की गई है, आप उस डिफ़ॉल्ट को बदल सकते हैं।


4

MSDN से क्लस्टर्ड इंडेक्स का उपयोग करके लिए गए उत्तर

क्या TABLE के पास Clustered Index के बिना प्राथमिक कुंजी हो सकती है? - हाँ।

क्या प्राथमिक कुंजी के बिना एक TABLE में क्लस्टर इंडेक्स हो सकता है? - हाँ।

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

एक सूचकांक स्वचालित रूप से एक प्राथमिक कुंजी को सौंपा जाता है (जैसा कि पंक्तियों को अक्सर उनकी प्राथमिक कुंजी द्वारा "ऊपर देखा जाता है")।

एक गैर-संकुलित सूचकांक पंक्तियों का एक तार्किक क्रम है, इसके स्तंभों में से एक (या अधिक)। इसे प्रभावी रूप से तालिका की एक और "कॉपी" के रूप में सोचें, जो भी सूचकांक भर में है।

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

पीके अक्सर (लेकिन हमेशा नहीं) एक क्लस्टर इंडेक्स होता है।


SQL सर्वर में, प्राथमिक कुंजी डिफ़ॉल्ट रूप से क्लस्टर की जाएगी - जब तक कि आप स्पष्ट रूप से यह नहीं बताते हैं। लेकिन यह सिर्फ एक डिफ़ॉल्ट है - एक आवश्यकता नहीं है।
marc_s

क्या किसी तालिका में बिना किसी सूचकांक के प्राथमिक कुंजी हो सकती है? क्योंकि, जब मैं कहता हूं कि एक कॉलम प्राथमिक कुंजी है, तो डिफ़ॉल्ट रूप से क्लस्टर इंडेक्स बनाया गया है। जब सूचकांक हटाते हैं, तो तालिका में प्राथमिक कुंजी नहीं होती है?
१०:३२ बजे

1

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


यह सही उत्तर के रूप में चिह्नित उत्तर के तहत अधिक टिप्पणी है।
जनवरी डॉगजेन

1
स्वागत - मैं आपको +1 दे रहा हूं क्योंकि मैं देख रहा हूं कि टिप्पणी जोड़ने के लिए आपके पास अभी तक प्रतिष्ठा नहीं है। (वहाँ किया गया था, कि :)
उलट इंजीनियर 7

0

यह इस प्रश्न के उत्तर के रूप में संबंधित नहीं हो सकता है, लेकिन प्राथमिक कुंजी और क्लस्टर इंडेक्स पर कुछ महत्वपूर्ण पहलू हैं ->

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.