सामान्य रूप से प्राथमिक कुंजी चुनते समय आप संकुल कुंजी भी चुनते हैं। वे दोनों अक्सर भ्रमित होते हैं, लेकिन आपको अंतर समझना होगा।
प्राथमिक कुंजियां तार्किक हैं व्यवसाय तत्व प्राथमिक कुंजी का उपयोग आपके एप्लिकेशन द्वारा किसी इकाई की पहचान करने के लिए किया जाता है, और प्राथमिक कुंजी के बारे में चर्चा प्राकृतिक कुंजी या सरोगेट कुंजी का उपयोग करने के लिए काफी हद तक गीली होती है। लिंक बहुत अधिक विस्तार में जाते हैं, लेकिन मूल विचार यह है कि प्राकृतिक कुंजी मौजूदा इकाई संपत्ति जैसे ssn
से ली गई हैं या phone number
, जबकि सरोगेट कुंजियों का व्यावसायिक इकाई के संबंध में कोई अर्थ नहीं है, जैसे id
या rowid
और वे आमतौर पर IDENTITY
. प्रकार के होते हैं या किसी प्रकार का यूआईडी। मेरी व्यक्तिगत राय है कि सरोगेट कुंजियाँ प्राकृतिक कुंजियों से बेहतर होती हैं, और पसंद हमेशा स्थानीय केवल आवेदकों के लिए पहचान मान होनी चाहिए, किसी भी प्रकार के वितरित डेटा के लिए मार्गदर्शक। इकाई के जीवनकाल के दौरान प्राथमिक कुंजी कभी नहीं बदलती।
संकुल कुंजियां वे कुंजी हैं जो तालिका में पंक्तियों के भौतिक भंडारण को परिभाषित करती हैं। ज्यादातर बार वे प्राथमिक कुंजी (तार्किक इकाई पहचानकर्ता) के साथ ओवरलैप करते हैं, लेकिन यह वास्तव में लागू नहीं होता है और न ही आवश्यक होता है। जब दोनों अलग होते हैं तो इसका मतलब है कि टेबल पर एक गैर-संकुल अद्वितीय अनुक्रमणिका है जो प्राथमिक कुंजी को लागू करती है। क्लस्टर किए गए कुंजी मान वास्तव में पंक्ति के जीवनकाल के दौरान बदल सकते हैं, जिसके परिणामस्वरूप पंक्ति को भौतिक रूप से तालिका में एक नए स्थान पर ले जाया जा सकता है। यदि आपको प्राथमिक कुंजी को क्लस्टर कुंजी से अलग करना है (और कभी-कभी आप करते हैं), तो एक अच्छी क्लस्टर कुंजी चुनना प्राथमिक कुंजी चुनने से काफी कठिन होता है। आपके संकुलित कुंजी डिज़ाइन को चलाने वाले दो प्राथमिक कारक हैं:
- प्रचलित डेटा एक्सेस पैटर्न ।
- भंडारण विचार ।
डेटा एक्सेस पैटर्न . इसके द्वारा मैं समझता हूं कि तालिका को किस तरह से पूछताछ और अद्यतन किया जाता है। याद रखें कि संकुल कुंजियाँ तालिका में पंक्तियों का वास्तविक क्रम निर्धारित करती हैं। कुछ एक्सेस पैटर्न के लिए, कुछ लेआउट क्वेरी गति या समसामयिकता को अपडेट करने के संबंध में दुनिया में सभी अंतर पैदा करते हैं:
-
वर्तमान बनाम संग्रह डेटा। कई अनुप्रयोगों में चालू माह से संबंधित डेटा को अक्सर एक्सेस किया जाता है, जबकि अतीत में शायद ही कभी एक्सेस किया जाता है। ऐसे मामलों में टेबल डिज़ाइन लेन-देन की तारीख से टेबल विभाजन का उपयोग करता है, अक्सर एक स्लाइडिंग विंडो एल्गोरिदम का उपयोग करते हुए। वर्तमान माह विभाजन को एक हॉट फास्ट डिस्क स्थित फाइलग्रुप पर रखा जाता है, संग्रहीत पुराने डेटा को सस्ते लेकिन धीमी स्टोरेज पर होस्ट किए गए फाइलग्रुप में ले जाया जाता है। जाहिर है इस मामले में संकुल कुंजी (तारीख) प्राथमिक कुंजी (लेनदेन आईडी) नहीं है। दोनों का पृथक्करण स्केल आवश्यकताओं द्वारा संचालित होता है, क्योंकि क्वेरी ऑप्टिमाइज़र यह पता लगाने में सक्षम होगा कि प्रश्न केवल वर्तमान विभाजन में रुचि रखते हैं और ऐतिहासिक विभाजन को भी नहीं देखते हैं।
-
फीफो कतार शैली प्रसंस्करण। इस मामले में टेबल में दो हॉट स्पॉट होते हैं:टेल जहां इंसर्ट होता है (एनक्यू), और हेड जहां डिलीट होता है (डेक्यू)। क्लस्टर कुंजी को इसे ध्यान में रखना होगा और तालिका को व्यवस्थित करना होगा ताकि डिस्क पर पूंछ और सिर के स्थान को भौतिक रूप से अलग किया जा सके, ताकि एनक्यू और डीक्यू के बीच समेकन की अनुमति मिल सके, उदाहरण के लिए। एक एनक्यू ऑर्डर कुंजी का उपयोग करके। शुद्ध . में कतारों में यह संकुल कुंजी ही एकमात्र कुंजी है, क्योंकि मेज पर कोई प्राथमिक कुंजी नहीं है (इसमें संदेश हैं) , नहीं इकाइयाँ ) लेकिन ज्यादातर बार कतार शुद्ध नहीं होती है, यह संस्थाओं के लिए भंडारण के रूप में और कतार के बीच की रेखा के रूप में भी कार्य करती है। और तालिका धुंधला है। इस मामले में एक प्राथमिक कुंजी भी होती है, जो संकुल कुंजी नहीं हो सकती है:संस्थाओं को फिर से कतारबद्ध किया जा सकता है, इस प्रकार एनक्यू क्रम क्लस्टर कुंजी मान को बदल सकता है, लेकिन वे प्राथमिक कुंजी मान को नहीं बदल सकते हैं। अलगाव को देखने में विफलता प्राथमिक कारण है कि उपयोगकर्ता तालिका समर्थित कतारें सही होने के लिए इतनी कुख्यात रूप से कठिन हैं और गतिरोधों से घिरी हुई हैं:क्योंकि एन्क्यू और डेक्यू इंटरलीव्ड ट्राउट टेबल के बजाय पूंछ और कतार के शीर्ष पर स्थानीयकृत होते हैं।
-
सहसंबद्ध प्रसंस्करण। जब आवेदन अच्छी तरह से डिज़ाइन किया गया है तो यह अपने कार्यकर्ता धागे के बीच सहसंबंधित वस्तुओं के प्रसंस्करण को विभाजित करेगा। उदाहरण के लिए एक प्रोसेसर को 8 वर्कर थ्रेड (सर्वर पर 8 सीपीयू से मेल खाने के लिए कहें) के लिए डिज़ाइन किया गया है, इसलिए प्रोसेसर डेटा को आपस में विभाजित करते हैं, जैसे। कार्यकर्ता 1 केवल ए से ई, कार्यकर्ता 2 एफ से जे आदि नाम के खातों को उठाता है। ऐसे मामलों में तालिका को वास्तव में खाते के नाम से क्लस्टर किया जाना चाहिए (या एक समग्र कुंजी जिसमें सबसे बाईं स्थिति खाता नाम का पहला अक्षर है), ताकि कार्यकर्ता तालिका में अपने प्रश्नों और अद्यतनों का स्थानीयकरण करें। इस तरह की तालिका में 8 अलग-अलग हॉट स्पॉट होंगे, जिस क्षेत्र में प्रत्येक कार्यकर्ता इस समय ध्यान केंद्रित करता है, लेकिन महत्वपूर्ण बात यह है कि वे ओवरलैप नहीं होते हैं (कोई अवरोध नहीं)। इस प्रकार का डिज़ाइन उच्च थ्रूपुट OLTP डिज़ाइनों और TPCC बेंचमार्क लोड में प्रचलित है, जहाँ इस प्रकार का विभाजन बफ़र पूल (NUMA इलाके) में लोड किए गए पृष्ठों की मेमोरी लोकेशन में भी दिखाई देता है, लेकिन मैं पीछे हट जाता हूँ।
भंडारण विचार . संकुल कुंजी चौड़ाई तालिका के भंडारण में भारी असर पड़ता है। एक के लिए कुंजी बी-पेड़ के प्रत्येक गैर-पत्ती पृष्ठ में स्थान लेती है, इसलिए एक बड़ी कुंजी अधिक स्थान पर कब्जा कर लेगी। दूसरा, और अक्सर अधिक महत्वपूर्ण यह है कि प्रत्येक गैर-संकुल कुंजी द्वारा संकुल कुंजी का उपयोग लुकअप कुंजी के रूप में किया जाता है, इसलिए प्रत्येक गैर-संकुल कुंजी को प्रत्येक पंक्ति के लिए संकुल कुंजी की पूरी चौड़ाई को संग्रहीत करना होगा। यही कारण है कि बड़ी संकुल कुंजियाँ जैसे varchar(256) और संकुल अनुक्रमणिका कुंजियों के लिए खराब विकल्प बनाती हैं।
कुंजी के चुनाव का भी संकुल अनुक्रमणिका विखंडन पर प्रभाव पड़ता है, कभी-कभी प्रदर्शन को अत्यधिक प्रभावित करता है।
ये दो बल कभी-कभी विरोधी हो सकते हैं, डेटा एक्सेस पैटर्न के लिए एक निश्चित बड़ी क्लस्टर कुंजी की आवश्यकता होती है जो भंडारण की समस्याओं का कारण बनेगी। ऐसे मामलों में निश्चित रूप से संतुलन की जरूरत होती है, लेकिन कोई जादू का फार्मूला नहीं है। मीठे स्थान पर पहुंचने के लिए आप मापते हैं और परीक्षण करते हैं।
तो हम इन सब से क्या बनाते हैं? हमेशा क्लस्टर कुंजी पर विचार करके प्रारंभ करें जो कि फ़ॉर्म की प्राथमिक कुंजी भी है entity_id IDENTITY(1,1) NOT NULL
. उपयुक्त होने पर दोनों को अलग करें और तदनुसार तालिका व्यवस्थित करें (उदा. तिथि के अनुसार विभाजन)।