एसक्यूएल सर्वर 2008 - विभाजन और क्लस्टर इंडेक्स


16

इसलिए मुझे यह कहकर प्रस्तावना दें कि मेरे डीबी डिजाइन पर कुल नियंत्रण नहीं है, इसलिए इस परिदृश्य के उद्देश्यों के लिए वर्तमान प्रणाली के बहुत सारे पहलुओं को नहीं बदला जा सकता है।

डिजाइन के पहलुओं पर पुनर्विचार कैसे करना चाहिए, इसके बारे में टिप्पणियाँ सही होने की संभावना है लेकिन अनहेल्दी :)

मेरे पास एक बहुत बड़ी तालिका है, लगभग 150 फ़ील्ड्स चौड़ी और लगभग 600 m पंक्तियाँ, जो बड़ी संख्या में प्रक्रियाएँ चलाती हैं। यह एक डेटा वेयरहाउस स्थिति में है, इसलिए हमारे पास निर्धारित लोड प्रक्रिया के बाहर कोई अपडेट / आवेषण नहीं है, इसलिए यह भारी अनुक्रमित है।

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

वर्तमान में हम एक फ़ील्ड पर क्लस्टर करते हैं जिसे हम कॉल करेंगे IncidentKeyजो कि एक varchar(50)अद्वितीय है और अद्वितीय नहीं है - हम 1-100 रिकॉर्डों के साथ एक ही हो सकते हैं IK(कोई टिप्पणी नहीं कृपया)। हम अक्सर पुराने IncidentKeyरिकॉर्ड पर नया डेटा प्राप्त करते हैं, इसलिए यह अनुक्रमिक नहीं है।

मैं समझता हूं कि मुझे IncidentDateविभाजन को सही ढंग से काम करने के लिए अपने संकुल सूचकांक कुंजी में अपने विभाजन क्षेत्र को शामिल करने की आवश्यकता है। मैं सोच रहा हूं कि यह होगा IncidentKey, IncidentDate

सवाल यह है कि, विभाजन तालिका में 2 भाग कुंजी पर एक संकुल सूचकांक के मैकेनिक्स कैसे काम करेंगे, यदि "नया" विभाजन में एक रिकॉर्ड क्लस्टर सूचकांक में "पुराने" विभाजन में रिकॉर्ड से पहले होना चाहिए?

उदाहरण के लिए, मेरे पास 5 रिकॉर्ड हैं:

IncidentKey    Date

ABC123        1/1/2010
ABC123        7/1/2010
ABC123        1/1/2011
XYZ999        1/1/2010
XYZ999        7/1/2010

अगर मुझे इसके लिए एक नया रिकॉर्ड मिलता है, तो ABC123, 2/1/2011इसे क्लस्टर इंडेक्स BEFORE में होना चाहिए XYZ999, 1/1/2010। यह कैसे काम करता है?

मैं विखंडन और संकेत मान रहा हूं, लेकिन मैं दोहरे-भाग कुंजियों के साथ विभाजित तालिकाओं पर गैर-विभाजन वाले संकुल अनुक्रमित भौतिक संग्रहण और कॉन्फ़िगरेशन के बारे में कोई जानकारी नहीं पा सकता हूं।


तालिका के विभाजन का निर्णय क्यों किया गया? विभाजन से अपेक्षित लाभ क्या हैं?
रेमस रूसु

@ रेमस - मैं वास्तव में इसे एक परीक्षण के रूप में कर रहा हूं, इसलिए हमारे पास एक विभाजन और एक गैर-विभाजन संस्करण होगा। अपेक्षित लाभ लोड समय कम हो जाता है, और इंडेक्स बिल्ड समय। हम मासिक ईटीएल संचालन करते हैं जिसमें लगभग एक सप्ताह लगता है और आशा है कि यह उस समय को काफी कम कर देगा। हमारे पास लगभग 3 टीबी की तैनाती भी है जो हमें इससे कम होने की उम्मीद है।
जेएनके

जवाबों:


18

एक विभाजन तालिका वास्तव में एक साथ सिले व्यक्तिगत तालिकाओं के संग्रह की तरह अधिक है। तो आपके द्वारा क्लस्टरिंग IncidentKeyऔर विभाजन के उदाहरण में IncidentDate, यह कहें कि पार्टीशनिंग फंक्शन टेबल को दो भागों में विभाजित करता है ताकि 1/1/2010 पार्टीशन 1 में हो और 7/1/2010 पार्टीशन दो हो। डेटा को डिस्क पर बाहर रखा जाएगा:

Partition 1:
IncidentKey    Date
ABC123        1/1/2010
ABC123        1/1/2011
XYZ999        1/1/2010

Partition 2:
IncidentKey    Date
ABC123        7/1/2010
XYZ999        7/1/2010

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

किसी भी गैर-संकुल अनुक्रमणिका में किसी भी पंक्ति में संकुल अनुक्रमणिका कुंजी होगी, जिसके अनुरूप यह कहते हैं ABC123,7/1/2010। चूँकि क्लस्टर इंडेक्स कुंजी में हमेशा पार्टीशनिंग कुंजी कॉलम होता है, इसलिए इंजन को हमेशा यह पता चलेगा कि इस मान को खोजने के लिए क्लस्टर्ड इंडेक्स के किस पार्टीशन (पंक्तियाँ) में है (इस मामले में, विभाजन 2 में)।

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

संरेखित अनुक्रमणिका का उपयोग इन मुद्दों को हल करता है, लेकिन समस्याओं का अपना सेट लाता है, क्योंकि यह भौतिक, भंडारण डिजाइन, विकल्प डेटा डेटा में रिपल करता है:

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

इन प्रभावों को मैंने शायद ही कभी एक परियोजना की शुरुआत में कहा था जो विभाजन को दर्शाती है, लेकिन वे मौजूद हैं और गंभीर परिणाम हैं।

यदि आपको लगता है कि संरेखित सूचकांक एक दुर्लभ या चरम मामला है, तो इस पर विचार करें: कई मामलों में ईटीएल और विभाजन समाधानों की आधारशिला मचान तालिकाओं का तेज़ स्विच है। संचालन में स्विच को संरेखित अनुक्रमित की आवश्यकता होती है।

ओह, एक और बात: विदेशी कुंजियों के बारे में मेरी सारी दलील और विभाजन तालिका मूल्य को अन्य तालिकाओं के साथ जोड़ने के तरंग प्रभाव में समान रूप से सम्मिलित होता है


बिल्कुल सही, यह वही है जो मैं देख रहा था। हमें संरेखित अनुक्रमणिका का उपयोग करने की आवश्यकता होगी b / c स्वैपिंग ड्रॉ का एक हिस्सा है जो हम इसके साथ करना चाहते हैं। हम उस IncidentKeyक्षेत्र पर समूहीकृत सामूहिक कार्य का एक TON भी करते हैं , जो मुझे लगता है कि यह गंभीरता से बाधा उत्पन्न करेगा। मैं सभी विस्तार की सराहना करता हूं!
जेएनके

आमतौर पर विभाजन के लाभ परिचालन की समस्याओं को दूर करते हैं।
रेमस रूसु

यह हमारी आशा है, हम जल्द ही देखेंगे!
जेएनके

9

जब किसी क्लस्टर इंडेक्स में कई विभाजन होते हैं, तो प्रत्येक विभाजन में एक बी-ट्री संरचना होती है जिसमें उस विशिष्ट विभाजन के लिए डेटा होता है। उदाहरण के लिए, यदि एक संकुल सूचकांक में चार विभाजन होते हैं, तो चार बी-ट्री संरचनाएं होती हैं; प्रत्येक विभाजन में एक। संदर्भ। क्लस्टर इंडेक्स स्ट्रक्चर्स

विभाजन सूचकांक के लिए विशेष दिशानिर्देश

आप एक विभाजित सूचकांक के विशिष्ट विभाजनों का पुनर्निर्माण कर सकते हैं।

जैसे

ALTER INDEX IX_TransactionHistory_TransactionDate
ON Production.TransactionHistory
REBUILD Partition = 5;
GO

+1 लिंक के लिए, मैंने विशेष दिशानिर्देशों को पढ़ा था लेकिन उस पैराग्राफ को याद नहीं किया। फॉलोअप सवाल - हम IncidentKeyमैदान पर बहुत सारे एकत्रीकरण करते हैं, क्या आपको लगता है कि इससे प्रदर्शन पर प्रतिकूल प्रभाव पड़ेगा (मुझे एहसास है कि मुझे अभी भी परीक्षण करने की आवश्यकता होगी)?
जेएनके

मुझे आपकी सभी विशिष्ट परिस्थितियों का पता नहीं है, लेकिन इससे मुझे लगता है कि आप इंसिडेंट द्वारा विभाजन से बेहतर हो सकते हैं?
मिच गेहूं

हम तारीख पर विभाजन कर रहे हैं, लेकिन संकुल कुंजी चालू है IncidentKey- हम इस पर एक टन जोड़ते हैं और यह एक संस्थागत चीज है जिसका उपयोग हम क्लस्टर के लिए करते हैं। मैं एक वैकल्पिक कुंजी का परीक्षण कर रहा हूं, लेकिन अब इसके लिए मुझे उपयोग करना होगा।
जेएनके
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.