IsDeleted (सॉफ्ट डिलीट) को लागू करने के लिए मजबूर होने पर उपयुक्त इंडेक्स आर्किटेक्चर क्या है?


17

वर्तमान में, हमारे पास एक मौजूदा डेटाबेस और एप्लिकेशन है जो पूरी तरह कार्यात्मक है। मेरे पास इस बिंदु पर वास्तुकला को बदलने की क्षमता नहीं है। आज, डेटाबेस में प्रत्येक तालिका में "0 'के डिफ़ॉल्ट के साथ" IsDeleted "NOT NIT BIT फ़ील्ड है। जब एप्लिकेशन "डेटा को हटाता है", यह बस IsDeleted फ्लैग को 1 में अपडेट करता है।

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

एक अन्य प्रश्न मेरे पास फ़िल्टर्ड इंडेक्स के आसपास है। मैं समझता हूं कि मैं अनुक्रमित पर फिल्टर लगा सकता हूं जैसे कि "WHERE IsDeleted = 0" अनुक्रमित के आकार को कम करने के लिए। हालाँकि, चूंकि प्रत्येक जॉइन / क्वेरी को IsDeleted चेक को लागू करना होगा, क्या इससे फ़िल्टर किए गए इंडेक्स को उपयोग होने से रोका जा सकेगा (क्योंकि IsDeleted कॉलम का उपयोग जॉइन / क्वेरी में किया जाता है)?

याद रखें, मेरे पास IsDeleted दृष्टिकोण को बदलने की क्षमता नहीं है।

जवाबों:


13

यहां सबसे आसान तरीका यह है कि आप अपनी चाबियों और क्लस्टर किए गए इंडेक्स को छोड़ दें, और अपने गैर-क्लस्टर इंडेक्स के लिए फ़िल्टर किए गए इंडेक्स का उपयोग करें।

इसके अतिरिक्त आप प्राथमिक ढेर और अनूठे अनुक्रमित विभाजन को छोड़ कर, विभाजन किए गए ढेर या विभाजित क्लस्टर-कॉलमस्टोर्स (SQL सर्वर 2016+) में कुछ बड़ी तालिकाओं को स्थानांतरित कर सकते हैं। यह आपको अलग-अलग पंक्तियों के लिए गैर-कुंजी स्तंभों को एक अलग डेटा संरचना में धकेलने में सक्षम करेगा, जो अतिरिक्त रूप से अलग-अलग संपीड़ित किया जा सकता है या एक अलग फ़ाइलग्रुप पर संग्रहीत किया जा सकता है।

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

ईजी

SELECT ... WHERE ... AND IsDeleted=0

और नहीं:

SELECT ... WHERE ... AND IsDeleted=@IsDeleted

एक पैरामैटर का उपयोग फ़िल्टर किए गए इंडेक्स के उपयोग को रोक देगा, और आपको पैरामीटर सूँघने में परेशानी हो सकती है।


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

@JeroenMostert अच्छी सलाह। आरएलएस का उपयोग यहां भी किया जा सकता है, या ईएफ कोर ग्लोबल क्वेरी फिल्टर्स जैसा कुछ। docs.microsoft.com/en-us/ef/core/querying/filters
डेविड ब्राउन - Microsoft

9

यह एक अलोकप्रिय राय हो सकती है, लेकिन मुझे नहीं लगता कि एक "हर जगह ऐसा होता है" / एक आकार आपके प्रश्न के सभी उत्तर पर फिट बैठता है।

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

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

छोटे तालिकाओं या तालिकाओं के लिए, जिन्हें बहुत अधिक पढ़ा जाता है, फ़िल्टर्ड किए गए गैर-अनुक्रमित अनुक्रमणिका या दृश्य या कुछ भी जोड़ना वास्तव में आपके डेटाबेस में अनावश्यक ओवरहेड जोड़ सकता है।


2

उचित धारणा के तहत जो हटाए गए हैं वे दुर्लभ हैं, सूचकांकों में कोई भी परिवर्तन उचित समाधान नहीं है।

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

कृपया ध्यान दें कि जब तक आप विचारों का उपयोग नहीं कर रहे हैं, आपको वैसे भी फ़िल्टर शामिल करने के लिए अपने सभी प्रश्नों को संपादित करना होगा।


0

मैंने एक प्रणाली देखी है जहाँ IS_DELETED ध्वज या तो 0 है या PK का मान है। अन्य प्रणालियों में यह पीके का नकारात्मक था।

चूंकि अधिकांश प्रश्नों में "प्राकृतिक" या व्यवसाय (कभी-कभी मल्टी-फील्ड) कुंजी द्वारा मूल्यों को पुनः प्राप्त किया जाता है, वे कभी भी पीके को छोड़कर नहीं होते हैं; लेकिन उन्होंने हमेशा मुख्य तालिका के लिए और किसी भी शामिल तालिकाओं के लिए एक और IS_DELETED = 0 जोड़ा।

इस प्रणाली में परिवर्तनों को ट्रैक करने वाली प्रत्येक लेनदेन तालिका के लिए एक ऑडिट टेबल भी थी; और एप्लिकेशन में हटाए गए डेटा सहित सभी डेटा परिवर्तनों को प्रदर्शित करने की सुविधा थी।


0

आशा है कि आपके पास क्वेरी बदलने के लिए सही और क्षमता है।

हालाँकि, चूंकि प्रत्येक जॉइन / क्वेरी को IsDeleted चेक को लागू करना होगा, क्या इससे फ़िल्टर किए गए इंडेक्स को उपयोग होने से रोका जा सकेगा (क्योंकि IsDeleted कॉलम का उपयोग जॉइन / क्वेरी में किया जाता है)?

मैं एक महत्वपूर्ण बात कहना चाहता था, आशा है कि मैं इसे समझा सकूंगा।

जटिल क्वेरी में जहां Transaction tableऔर Masterटेबल दोनों का उपयोग किया जाता है।

IsDeleted=0केवल Transactionतालिका में उपयोग करें । Masterतालिका में उपयोग न करें ।

उदाहरण,

Select * from dbo.Order O
inner join dbo.category C on o.categoryid=o.categoryid
inner join dbo.Product P on P.Productid=o.Productid
where o.isdeleted=0

इसमें c.isdeleted=0( Categoryतालिका में) का कोई मतलब नहीं है । यह अनावश्यक है।

इसी तरह उपयोग करने का कोई मतलब है P.isdeleted=0?

क्योंकि मैं सभी अनिर्दिष्ट आदेश और उनका विवरण चाहता हूं।

कैसे कर सकते हैं Productजब हटा दिया Orderहै Activeया जहाँ भी Productidसंदर्भ है।

तो इस तरह से यदि आप महत्वपूर्ण क्वेरी में सावधानी से डिबग करते हैं, तो हो सकता है कि आप कुछ हटाए गए = 0 को हटा दें।

फ़िल्टर किए गए इंडेक्स को नेत्रहीन रूप से न बनाएं, पहले उन सभी बहुत महत्वपूर्ण और धीमी क्वेरी का चयन करें।

उन धीमी क्वेरी को ऑप्टिमाइज़ करें, उसके बाद ही फ़िल्टर किए गए इंडेक्स या ट्यून इंडेक्स के बारे में निर्णय लें।

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