ध्वज बनाम तालिका विभाजन


10

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

मैं दो डिजाइन विकल्पों पर विचार करता हूं:

  • थोड़ा सा झंडा
  • "अस्वीकृत" आइटम की एक अलग तालिका - जब आइटम को मंजूरी दे दी जाती है तो इसे "नियमित" तालिका में ले जाया जाता है (आइटम का आईडी का नवीनीकरण कोई समस्या नहीं है)

मुझे लगता है कि दूसरा विकल्प ज्यादा बेहतर है। बिट फ्लैग प्रति पंक्ति केवल एक बाइट लेता है, इसलिए यह कोई समस्या नहीं है। लेकिन हम अनुमोदित की एक लाख और एक ही तालिका में अस्वीकृत रिकॉर्ड की एक लाख है, तो - अनुमोदित रिकॉर्ड के साथ संचालन के लिए स्कैन समय बढ़ जाती है।

प्रश्न है: क्या मुझे इसके बजाय पहले (बिट फ्लैग) विकल्प पर विचार करना चाहिए? क्या वर्णित स्थिति में इसका कोई लाभ है?


1
यह याद रखने में मदद मिल सकती है कि आप अनुमोदित रिकॉर्ड तक पहुँच को गति देने में मदद करने के लिए फ़िल्टर्ड इंडेक्स का उपयोग कर सकते हैं। brentozar.com/archive/2013/11/…
मेंडोसि

दुर्भाग्यवश फ़िल्टर किए गए अनुक्रमित पैरामीटर प्रश्नों में उपयोग नहीं किए जाते हैं।
दीमा

@ दीमा यह पूरी तरह सच नहीं है। यदि एक फ़िल्टर किए गए इंडेक्स में कहा गया है WHERE status='A'और एक क्वेरी है WHERE status = 'A' AND (... other columns and parameters here...), तो इंडेक्स अभी भी उपयोग किया जा सकता है।
23

जवाबों:


6

आपके पास विभाजन के विचारों के साथ यह दोनों तरीके हो सकते हैं ।

आप प्रत्येक स्थिति के लिए एक अंतर्निहित तालिका बनाते हैं, जो बाधाओं द्वारा लागू की जाती है, पारस्परिक रूप से अनन्य मूल्यों के साथ। तब एक दृश्य जो यूनिअन को एक साथ अंतर्निहित तालिकाओं में देता है। दृश्य या प्रत्येक बेस टेबल को स्पष्ट रूप से संदर्भित किया जा सकता है। यदि किसी पंक्ति की स्थिति UPDATEd है तो दृश्य के माध्यम से DBMS इसे एक आधार तालिका से हटा देगा और इसे नई स्थिति के अनुरूप एक में सम्मिलित करेगा। प्रत्येक बेस टेबल को इसके उपयोग पैटर्न के अनुसार स्वतंत्र रूप से अनुक्रमित किया जा सकता है। यदि यह हो सकता है, तो अनुकूलक एक ही संगत आधार तालिका के सूचकांक संदर्भों को हल करेगा।

लाभ
एक) shallower अनुक्रमित हैं। हालाँकि, इंडेक्स फैन-आउट पर गणित करें। उस पैमाने पर और अपनी स्थिति के मूल्यों के बीच विभाजित करें यह संभव है कि अनुक्रमित विभाजन तालिकाओं पर समान गहराई होगी क्योंकि वे संयुक्त तालिका पर होंगे।
b) किसी भी एप्लीकेशन कोड को बदलना नहीं है। डेटा निरंतर संपूर्ण के रूप में प्रकट होता रहता है।
ग) भविष्य की नई स्थिति के मूल्यों में बाधा के साथ एक नई आधार तालिका जोड़कर और दृश्य को फिर से बनाया जा सकता है।

लागत है कि सभी डेटा आंदोलन; प्रत्येक स्थिति अद्यतन के लिए दो पृष्ठ और संबंधित सूचकांक लिखे गए हैं। से निपटने के लिए IO के बहुत सारे। इतना आंदोलन विखंडन का कारण भी बनेगा।


5

उन मदों की एक तालिका जिसमें (संभावित) लाखों रिकॉर्ड होंगे।

यह वास्तव में इतना नहीं है, जो SQL सर्वर कुशलता से संभाल सकता है। बेशक, मुझे अपनी पहले की नौकरियों में से एक याद है, जहां सबसे बड़ी तालिकाओं में से एक (एक-उदाहरण प्रणाली) में 2 मिलियन पंक्तियाँ थीं और वह सबसे अधिक थी जिसे मैंने कभी निपटा दिया था। फिर अगली नौकरी में 17 प्रोडक्शन इंस्टेंसेस थे जिनमें कुछ टेबल्स में लाखों-लाखों पंक्तियाँ थीं, और सभी को एक डेटा वेयरहाउस में एकत्रित किया गया था, जिसमें कई फैक्टर टेबल 1 बिलियन से अधिक पंक्तियाँ थीं। मुझे गलत मत समझो, मैं लाखों पंक्तियों में नहीं चिल्ला रहा हूं, मैं सिर्फ इस बात पर जोर दे रहा हूं कि एक अच्छा डेटा मॉडल और उचित अनुक्रमण (और सूचकांक रखरखाव) के साथ, SQL सर्वर बहुत कुछ संभाल सकता है ।

किसी भी समय 50% तक आइटम "अस्वीकृत" हो सकते हैं।

हम्म। यह सही नहीं लगता। "अनुमोदन" प्रविष्टियों की दर नई प्रविष्टियां प्राप्त करने की दर से आधी होगी? प्रत्येक 2 नई प्रविष्टियों के लिए, केवल 1 "अनुमोदित" होगा? 2 मिलियन पंक्तियों के अपने उदाहरण में, और "स्वीकृत" और "अप्राप्त" के लिए 1 मिलियन प्रत्येक, कुछ साल बाद एक और 10 मिलियन प्रविष्टियों के साथ, आपको "स्वीकृत" और "अस्वीकृत" के लिए 6 मिलियन प्रत्येक की उम्मीद है? या क्या यह है कि 1 मिलियन "अप्राप्त" कुछ स्थिर रहेगा, जैसे कि 10 मिलियन नई प्रविष्टियों के साथ, 11 मिलियन "स्वीकृत" और अभी भी 1 मिलियन "अप्राप्त" होंगे?

रिकॉर्ड "स्वीकृत" हो सकते हैं, लेकिन इसके विपरीत नहीं।

यह आज सच है , लेकिन समय के साथ चीजें बदल जाती हैं और इसलिए हमेशा संभावना होती है कि व्यवसाय "अप्रतिष्ठित", या शायद कुछ अन्य स्थिति, जैसे "संग्रहीत", आदि के लिए अनुमति दे सकता है।

तो, आइए विकल्पों को देखें:

झंडा (या संभवतः TINYINT"स्थिति")

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

दो अलग-अलग टेबल ("स्वीकृत" के लिए एक, "अप्रयुक्त" के लिए)

  • प्रत्येक स्थिति के प्रश्नों के लिए थोड़ा तेज़
  • समय के साथ कम लचीला / एक तीसरे राज्य (जैसे "संग्रहीत") जैसे परिवर्तन को शामिल करने के लिए कठिन; नए राज्य को सबसे अधिक संभावना एक और तालिका की आवश्यकता होगी, और निश्चित रूप से नए और अद्यतन कोड।
  • अधिक कार्य (अर्थात कोड, परीक्षण, आदि) और "अप्रतिबंधित" तालिका से "स्वीकृत" तालिका में त्रुटि के लिए अधिक स्थान।
  • अधिक जटिल = समय के साथ उच्च रखरखाव लागत, नए कर्मचारियों के लिए लंबे समय तक प्रशिक्षण का पता लगाने के लिए
  • (संभवतः) लेन-देन लॉग करने के लिए ग्रेटर प्रभाव के रूप में एक तालिका हटा दी जाती है और एक डाला जाता है
  • " आइटम आईडी के नवीकरण " के बारे में चिंता करने की कोई आवश्यकता नहीं है : अनपेक्षित तालिका में आईडी स्तंभ है जो एक IDENTITYस्तंभ है, और स्वीकृत तालिका में आईडी स्तंभ है जो एक नहीं है IDENTITY(जैसा कि वहां इसकी आवश्यकता नहीं है)। इसलिए आईडी मान तालिकाओं के बीच रिकॉर्ड चाल के रूप में सुसंगत रहते हैं।

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


यह एक तेज़ गति वाले डेटा के साथ एक तालिका है: अक्सर कई नई पंक्तियों के साथ आबादी वाली, अक्सर पंक्तियों को हटा दिया जाता है। मैंने केवल एक ही विषय पर ध्यान केंद्रित करने के लिए सभी विवरणों (जैसे व्यावसायिक निर्णय, क्लाइंट कोडिंग, आदि) को हटाने की कोशिश की। मूल रूप से हमारे पास एक पुराने ध्वज के साथ पुराने डिजाइन की तालिका है। और मैं 100% के लिए जानता हूं कि पंक्तियों को जहां झंडा 1 पर सेट किया गया है, कभी किसी अन्य तालिका में उपयोग नहीं किया जाता है। इसलिए मुझे लगता है कि वे केवल वहां जाते हैं और उन्हें एक अलग टेबल पर ले जाया जा सकता है। तालिका को लगभग हर क्वेरी पर DB में स्कैन किया जाता है। तो इसके "वजन" को कम करने से सीपीयू / आईओ ऑप्स कम हो सकते हैं।
दिमा

3
स्प्लिट टेबल का एक और फायदा: आपके पास एफके हो सकता है जो केवल "स्वीकृत" टेबल का संदर्भ देता है।
ypercubeᵀᴹ 21

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