डेटा संग्रह के लिए तालिका विभाजन


13

परिदृश्य:

  • दो डेटाबेस: DB_A और DB_Arive एक बहुत बड़ी तालिका के साथ तालिका कहा जाता है।
  • हर दिन, 60 दिनों से अधिक पुराने रिकॉर्ड DB_A से हटा दिए जाते हैं और मुख्य रूप से DB_Achive में स्थानांतरित कर दिया जाता है ताकि बात "अलग" हो जाए क्योंकि पिछले 2 महीनों के रिकॉर्ड के लिए टेबल_ DB_A पर भारी है।

मैं इस प्रक्रिया से छुटकारा पाना चाहता हूं क्योंकि यह धीमा है और बहुत सारे संसाधनों का उपभोग करता है। मैं एक तारीख स्तंभ पर एक विभाजन फ़ंक्शन के साथ DB_A पर तालिका विभाजन को लागू करने और सभी अभिलेखों को संग्रहीत करने के बारे में सोच रहा हूं <2 महीने एक विभाजन पर और सभी रिकॉर्ड> 2 महीने किसी अन्य विभाजन पर। मेरे सवाल:

  • क्या यह परिदृश्य ऐसा व्यवहार करने वाला है जैसे कि मेरे पास 2 अलग-अलग डेटाबेस हैं? अगर मैं अपने टेबलए को रिकॉर्ड्स> गेटडेट () - 30 के लिए क्वेरी करता हूं, तो क्या यह अभिलेखीय विभाजन को पढ़ने जा रहा है?
  • मुझे लगा कि मुझे अनुक्रमणिका को भी विभाजन करना है, है ना?
  • मैं इस तथ्य से कैसे निपटता हूं कि कल मेरा विभाजन फ़ंक्शन "परिवर्तन" करेगा, मेरा मतलब है, अगर मैं आज फ़ंक्शन बनाता हूं (2 जुलाई को, इसकी सीमा 2 मई होगी, लेकिन कल 3 मई होगी)। क्या मैं एक गतिशील विभाजन फ़ंक्शन बना सकता हूं?

मुझे नहीं लगता कि एक गतिशील फ़ंक्शन एक अच्छा विचार है भले ही इसे अनुमति दी गई थी (मुझे नहीं लगता कि यह है) ... हम जल्द ही और अधिक विवरण में मिल सकते हैं लेकिन मुझे लगता है कि आपको शायद कैलेंडर की तारीख के आधार पर विभाजन करना चाहिए और आगे बढ़ना चाहिए एक समय में एक विभाजन ... लेकिन यहाँ कई विकल्प हैं।
JNK

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

हाय मार्क, हाँ कृपया करें, और यदि आप अपना अनुभव भी साझा कर सकते हैं। क्या यह सफल रहा?
डिएगो

यह काम करता है लेकिन अंततः अनावश्यक था (हमने एक सरल मार्ग लिया)। शायद आप इस बात का विस्तार कर सकते हैं कि आपके मामले में 60 दिन की सीमा क्यों है? सभी को सही दिशा में इंगित करने में आपकी सहायता करेगा।
मार्क स्टोर-स्मिथ

जवाबों:


6

विभाजन के साथ आपको प्रति दिन एक विभाजन करना होगा, जो कि 1000 पारियों की प्री-एसक्यूएल 2012 सीमा को एक नए परिप्रेक्ष्य में रखता है क्योंकि यह केवल 3 साल के संग्रह के लिए अनुमति देगा। SQL सर्वर 2012 के साथ आपको 15000 विभाजन मिलते हैं जो प्रति दिन 1 विभाजन के लिए बहुत है।

हर दिन आप एक नया विभाजन जोड़ते हैं। यदि आप 61 वें पिछले दिन विभाजन को स्थानांतरित करना चाहते हैं तो आप इसे कुशलतापूर्वक कर सकते हैं, लेकिन फिर भी एक ऑफ़लाइन ऑपरेशन है। देखें कुशलतापूर्वक किसी भिन्न फ़ाइल समूह के लिए एक विभाजन ले जाएँ

आपके सभी इंडेक्स को संरेखित करना होगा, विभाजन किए गए इंडेक्स के लिए विशेष दिशानिर्देश देखें ।

विभाजन में खरीदना एक आसान विचलन नहीं है और यह चबाने के लिए काफी बड़ा हो सकता है ... देखें कि कैसे तय करें यदि आपको टेबल विभाजन का उपयोग करना चाहिए । विशेष रूप से आपको विभाजन से प्रदर्शन में सुधार की उम्मीद नहीं करनी चाहिए। आपको डेटटाइम द्वारा क्लस्टरिंग करके समय पर प्रदर्शन समस्याओं का सामना करना चाहिए।


नई सीमा 2008 SP2 और 2008 R2 SP1 में उपलब्ध है। blogs.msdn.com/b/hanspo/archive/2010/11/29/…
जॉन

@Jon: 2008 SP2 में, 2008R2 SP1 कार्यान्वयन एक बड़ी चेतावनी के साथ आता है . As explained in this white paper, there are implications on certain features, including performance.। SQL 2012 समर्थन कोई चेतावनी के साथ आता है।
रेमस रूसु जूल

यह बात बताने के लिए धन्यवाद; यह सच है कि 2008/2008 R2 पर इसका उपयोग करने के लिए कुछ चेतावनी हैं, लेकिन यदि आवश्यक हो तो यह एक उपलब्ध विकल्प है।
जॉन सिगेल जूल

आपके कमेंट के लिए धन्यवाद। मैं सामग्री टिप्पणी को बाद में
डिएगो

2

मुझे नहीं पता कि विभाजन फ़ंक्शन गतिशील हो सकता है लेकिन मुझे संदेह है। उस मार्ग से जाने के बिना आपके लिए कुछ विकल्प:

1 - कैलेंडर DATE पर विभाजन और प्रत्येक दिन सबसे पुराने विभाजन को बंद करें

2 - एक ऐसा दृश्य बनाएं जो दिनांक को फ़िल्टर करता है, और अपने सभी मौजूदा प्रश्नों को इंगित करता है (यह आसानी से अंतर्निहित तालिका का नाम बदलकर कुछ और किया जा सकता है और दृश्य का नामकरण कर सकता है जो वर्तमान तालिका का नाम है)। यह अनुक्रमणिका परिवर्तन के साथ अनुकूलित किया जा सकता है।

ध्यान रखें कि यदि आप अपने प्रश्नों में दिनांक फ़ील्ड का उपयोग करते हैं तो ऊपर दिया गया पहला विकल्प बेहतर काम करेगा। यदि आप इसे अभी भी वर्तमान प्रक्रिया की तुलना में तेज नहीं करेंगे, लेकिन प्रश्नों में भारी सुधार नहीं होगा। यदि आप अपने विभाजन क्षेत्र पर फ़िल्टर कर सकते हैं तो सामान्य कार्यों में विभाजन सबसे अच्छा है और ऑप्टिमाइज़र जानता है कि किस विभाजन को देखना है।


मैं
डिएगो

2

यहां आपके लिए क्या काम करना चाहिए: DB_A - टेबलए पिछले 60 दिनों में से प्रत्येक के लिए एक अलग विभाजन के साथ - सबसे पुराने विभाजन से डेटा स्थानांतरित करने के लिए स्टेजिंगटेबल

DB_Archive tableA - 60 दिनों से अधिक पुराने सभी डेटा को संग्रहीत करता है। (विभाजन नहीं हुआ)

प्रक्रिया: 1. दिन के अंत से पहले: विभाजन फ़ंक्शन को बदलें - नए दिन के लिए एक नया विभाजन जोड़ने के लिए विभाजन रेंज। (NB: "आज की तारीख + 1 दिन" के लिए विभाजन बनाने के बजाय आप कुछ कदम आगे रहना चाह सकते हैं। उदाहरण के लिए: "आज की तारीख + 5 दिन"

  1. प्रत्येक दिन के अंत के बाद, आप सबसे पहले DB_A.tableA में सबसे पुराने विभाजन को DB_A.stagingTable में स्विच करते हैं; सबसे पुराने विभाजन को मिलाएं।

  2. DB_A.stagingTable से DB_Archive.tableA पर डेटा आयात करें। अंत में trunacte DB_A.stagingTable

ऊपर रोलिंग विंडो कहा जाता है और VLDB के लिए एक बहुत ही सामान्य परिदृश्य है। विभाजन पर Microsoft द्वारा इस श्वेत पत्र को देखें: विभाजन तालिका और सूचकांक रणनीतियों या विशेष रूप से स्लाइडिंग विंडो परिदृश्य पर यह प्रयास करें


0

आप SQL सर्वर में डेटा संग्रहीत और शुद्ध करने के गतिशील दृष्टिकोण का उपयोग कर सकते हैं। कृपया उसके लिए नीचे दिए गए लिंक का अनुसरण करें।

http://www.sqlscientist.com/2012/09/auto-maintain-archival-process.html


1
क्या आप अपने जवाब में उस पोस्ट के मुख्य बिंदुओं को शामिल कर सकते हैं? आप जानते हैं, लिंक आते हैं और जाते हैं और जब वे जाते हैं, तो आपके पोस्ट में केवल एक मृत लिंक होगा।
dezso
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.