सभी लेकिन वर्तमान वर्ष को संग्रहीत करने और एक ही समय में तालिका को विभाजित करने का सबसे अच्छा तरीका क्या है


23

कार्य

सभी को हटा दें, लेकिन बड़ी तालिकाओं के समूह से एक रोलिंग 13 महीने की अवधि। संग्रहीत डेटा को किसी अन्य डेटाबेस में संग्रहीत किया जाना चाहिए।

  • डेटाबेस सरल पुनर्प्राप्ति मोड में है
  • टेबल 50 बिलियन से लेकर कई बिलियन हैं और कुछ मामलों में प्रत्येक में सैकड़ों gb लगते हैं।
  • तालिकाएँ वर्तमान में विभाजित नहीं हैं
  • प्रत्येक तालिका में एक बढ़ती तिथि वाले स्तंभ पर एक संकुल सूचकांक होता है
  • प्रत्येक तालिका में एक गैर-संकुल सूचकांक है
  • तालिकाओं में सभी डेटा परिवर्तन आवेषण हैं
  • लक्ष्य प्राथमिक डेटाबेस के डाउनटाइम को कम करना है।
  • सर्वर 2008 R2 एंटरप्राइज़ है

"संग्रह" तालिका में लगभग 1.1 बिलियन पंक्तियाँ होंगी, "लाइव" तालिका लगभग 400 मिलियन। स्पष्ट रूप से समय के साथ संग्रह तालिका में वृद्धि होगी, लेकिन मुझे उम्मीद है कि लाइव तालिका में यथोचित तेजी से वृद्धि होगी। कम से कम अगले कुछ वर्षों में 50% कहें।

मैंने Azure खिंचाव डेटाबेस के बारे में सोचा था लेकिन दुर्भाग्य से हम 2008 R2 में हैं और कुछ समय के लिए वहाँ रहने की संभावना है।

वर्तमान योजना

  • एक नया डेटाबेस बनाएँ
  • नए डेटाबेस में महीने द्वारा विभाजित नई तालिकाएँ (संशोधित तिथि का उपयोग करके) बनाएं।
  • विभाजन सारणी में सबसे हाल के 12-13 महीनों के डेटा को स्थानांतरित करें।
  • दो डेटाबेस का नाम बदलें स्वैप करें
  • अब "संग्रह" डेटाबेस से स्थानांतरित डेटा हटाएं।
  • "संग्रह" डेटाबेस में प्रत्येक तालिका का विभाजन।
  • भविष्य में डेटा को संग्रहीत करने के लिए विभाजन स्वैप का उपयोग करें।
    • मुझे पता है कि मुझे संग्रहित किए जाने वाले डेटा को स्वैप करना होगा, उस तालिका को आर्काइव डेटाबेस में कॉपी करना होगा, और फिर उसे संग्रह तालिका में स्वैप करना होगा। यह स्वीकार्य है।

समस्या: मैं डेटा को प्रारंभिक विभाजन तालिकाओं में स्थानांतरित करने की कोशिश कर रहा हूं (वास्तव में मैं अभी भी इस पर अवधारणा का प्रमाण कर रहा हूं)। मैं TF 610 ( डेटा लोडिंग परफॉर्मेंस गाइड के अनुसार ) और INSERT...SELECTडेटा को शुरू में स्थानांतरित करने के लिए एक स्टेटमेंट के अनुसार इसे न्यूनतम रूप से लॉग इन करने की कोशिश करूंगा। दुर्भाग्य से हर बार मैं कोशिश करता हूं कि यह पूरी तरह से लॉग इन हो।

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

क्या मेरी सामान्य योजना में कुछ भी गायब है, और डेटा को जल्दी से स्थानांतरित करने के लिए SSIS की मेरी सबसे अच्छी शर्त है (लॉग के स्थान का कम से कम उपयोग)?

डेटा के बिना डेमो कोड

-- Existing structure
USE [Audit]
GO

CREATE TABLE [dbo].[AuditTable](
    [Col1] [bigint] NULL,
    [Col2] [int] NULL,
    [Col3] [int] NULL,
    [Col4] [int] NULL,
    [Col5] [int] NULL,
    [Col6] [money] NULL,
    [Modified] [datetime] NULL,
    [ModifiedBy] [varchar](50) NULL,
    [ModifiedType] [char](1) NULL
); 
-- ~1.4 bill rows, ~20% in the last year

CREATE CLUSTERED INDEX [AuditTable_Modified] ON [dbo].[AuditTable]
(   [Modified] ASC   )
GO


-- New DB & Code
USE Audit_New
GO

CREATE PARTITION FUNCTION ThirteenMonthPartFunction (datetime)
AS RANGE RIGHT FOR VALUES ('20150701', '20150801', '20150901', '20151001', '20151101', '20151201', 
                            '20160101', '20160201', '20160301', '20160401', '20160501', '20160601', 
                            '20160701') 

CREATE PARTITION SCHEME ThirteenMonthPartScheme AS PARTITION ThirteenMonthPartFunction
ALL TO ( [PRIMARY] );

CREATE TABLE [dbo].[AuditTable](
    [Col1] [bigint] NULL,
    [Col2] [int] NULL,
    [Col3] [int] NULL,
    [Col4] [int] NULL,
    [Col5] [int] NULL,
    [Col6] [money] NULL,
    [Modified] [datetime] NULL,
    [ModifiedBy] [varchar](50) NULL,
    [ModifiedType] [char](1) NULL
) ON ThirteenMonthPartScheme (Modified)
GO

CREATE CLUSTERED INDEX [AuditTable_Modified] ON [dbo].[AuditTable]
(
    [Modified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ThirteenMonthPartScheme (Modified)
GO

CREATE NONCLUSTERED INDEX [AuditTable_Col1_Col2_Col3_Col4_Modified] ON [dbo].[AuditTable]
(
    [Col1] ASC,
    [Col2] ASC,
    [Col3] ASC,
    [Col4] ASC,
    [Modified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ThirteenMonthPartScheme (Modified)
GO

कोड ले जाएँ

USE Audit_New
GO
DBCC TRACEON(610);

INSERT INTO AuditTable
SELECT * FROM Audit.dbo.AuditTable
WHERE Modified >= '6/1/2015'
ORDER BY Modified

आरई "डेटा को स्थानांतरित करें": लॉग उपयोग को कम करने के लिए आप डेटा को बैचों में स्थानांतरित कर सकते हैं जैसे "एप्रोच 2" में dba.stackexchange.com/a/139009/94130 । विभाजन के विषय पर आपने विभाजन के विचारों पर विचार किया है?
एलेक्स

@ ऐलेक्सा, मैंने उन दोनों पर विचार किया है। मेरी बैकअप योजना SSIS का उपयोग करके डेटा को बैचों में स्थानांतरित करना है। और इस विशेष मामले के लिए मेरा मुद्दा वास्तव में क्या विभाजन के लिए बनाया गया है। (स्विचिंग का उपयोग करके डेटा का त्वरित लोड / अनलोड)
केनेथ फिशर

जवाबों:


10

आपको न्यूनतम लॉगिंग क्यों नहीं मिल रही है?

मुझे डेटा लोडिंग परफॉरमेंस गाइड मिल गया है , जिसे आप एक अत्यंत मूल्यवान संसाधन मानते हैं। हालांकि, यह भी 100% व्यापक नहीं है, और मुझे संदेह है कि ग्रिड पहले से ही काफी जटिल है कि लेखक ने Table Partitioningव्यवहार में अंतर को तोड़ने के लिए एक स्तंभ नहीं जोड़ा है, इस पर निर्भर करता है कि आवेषण प्राप्त करने वाली तालिका का विभाजन होता है या नहीं। जैसा कि हम बाद में देखेंगे, तथ्य यह है कि तालिका पहले से ही विभाजित है न्यूनतम लॉगिंग को बाधित करने के लिए प्रकट होती है।

यहाँ छवि विवरण दर्ज करें

अनुशंसित दृष्टिकोण

डेटा लोडिंग परफॉरमेंस गाइड ("बल्क लोडिंग ए पार्टीशन टेबल" खंड सहित) में सिफारिशों के आधार पर, दसियों अरबों पंक्तियों के साथ व्यापक अनुभव लोडिंग टेबल को लोड करने का व्यापक अनुभव, यहाँ वह दृष्टिकोण है जो मैं सुझाऊँगा:

  • एक नया डेटाबेस बनाएँ।
  • नए डेटाबेस में महीने के हिसाब से नए टेबल बनाएं।
  • निम्नलिखित फैशन में, हाल के वर्ष का डेटा स्थानांतरित करें:
    • प्रत्येक महीने के लिए, एक नया ढेर तालिका बनाएं;
    • TABLOCK संकेत का उपयोग करके ढेर में डेटा का वह महीना डालें;
    • डेटा के उस महीने वाले ढेर में संकुल सूचकांक जोड़ें;
    • यह जाँचने में बाधा डालें कि तालिका में केवल इस महीने का डेटा है;
    • नए समग्र विभाजन तालिका के संगत विभाजन में तालिका को स्विच करें।
  • दो डेटाबेस का नाम बदलें स्वैप करें।
  • अब "आर्काइव" डेटाबेस में डेटा ट्रंक करें।
  • "संग्रह" डेटाबेस में प्रत्येक तालिका का विभाजन।
  • भविष्य में डेटा को संग्रहीत करने के लिए विभाजन स्वैप का उपयोग करें।

आपके मूल दृष्टिकोण की तुलना में अंतर:

  • यदि आप TABLOCKविभाजन को तालिका में डेटा को रखने के लिए विभाजन स्विचिंग का उपयोग करते हुए हाल के 12-13 महीनों के डेटा को स्थानांतरित करने की कार्यप्रणाली बहुत अधिक कुशल हैं, तो आप एक महीने में एक ही बार लोड करते हैं ।
  • एक DELETEदूर स्पष्ट करने के लिए पुराने तालिका पूरी तरह से लॉग इन किया जाएगा। शायद आप TRUNCATEया तो तालिका को गिरा सकते हैं या एक नया संग्रह तालिका बना सकते हैं।

डेटा के हाल के वर्ष को आगे बढ़ाने के लिए दृष्टिकोणों की तुलना

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

जैसा कि आप नीचे दिए गए परिणामों से देख सकते हैं, TABLOCKसंकेत का उपयोग करके ढेर में डेटा लोड करके लॉग राइट में बड़े प्रदर्शन को बढ़ावा देना और कमी करना है। एक बार में एक विभाजन करने पर अतिरिक्त लाभ होता है। यह भी ध्यान देने योग्य है कि एक बार में एक से अधिक विभाजन चलाने पर एक-विभाजन-पर-एक-समय पद्धति को आसानी से समानांतर किया जा सकता है। आपके हार्डवेयर के आधार पर, यह एक अच्छा बढ़ावा दे सकता है; हम आमतौर पर सर्वर-क्लास हार्डवेयर पर एक साथ कम से कम चार विभाजन लोड करते हैं।

यहाँ छवि विवरण दर्ज करें

यहाँ पूर्ण परीक्षण स्क्रिप्ट है

अंतिम नोट्स

ये सभी परिणाम आपके हार्डवेयर पर कुछ हद तक निर्भर करते हैं। हालांकि, मेरे परीक्षण एक मानक क्वाड-कोर लैपटॉप पर डिस्क ड्राइव के साथ कताई किए गए थे। यह संभावना है कि यदि आप इस प्रक्रिया का संचालन कर रहे हैं, तो एक सभ्य सर्वर का उपयोग करने पर डेटा लोड बहुत अधिक होना चाहिए।

उदाहरण के लिए, मैंने एक वास्तविक देव सर्वर (डेल R720) पर अनुशंसित दृष्टिकोण चलाया और अपने लैपटॉप पर 76 seconds(से 156 seconds) में कमी देखी । दिलचस्प है, एक विभाजन तालिका में डालने का मूल दृष्टिकोण एक ही सुधार का अनुभव नहीं करता था और अभी भी 12 minutesदेव सर्वर पर ही लिया गया था। संभवतया ऐसा इसलिए है क्योंकि यह पैटर्न एक धारावाहिक निष्पादन योजना देता है, और मेरे लैपटॉप पर एक एकल प्रोसेसर देव सर्वर पर एक प्रोसेसर से मेल कर सकता है।


धन्यवाद फिर से ज्योफ। मैं स्विच विधि का उपयोग कर रहा हूं। विशेष रूप से मैं एसएसआईएस और डायनामिक एसक्यूएल का उपयोग कर रहा हूं ताकि 13 महीने समानांतर चल सकें।
केनेथ फिशर

1

यह बिमल के लिए एक अच्छा उम्मीदवार हो सकता है। एक दृष्टिकोण एक पुन: प्रयोज्य टेम्पलेट बनाने के लिए होगा जो कि प्रत्येक कंटेनर के लिए छोटी तिथि सीमाओं में एक एकल तालिका के लिए डेटा माइग्रेट करेगा। Biml प्रत्येक योग्यता तालिका के लिए समान पैकेज बनाने के लिए आपके टेबल संग्रह के माध्यम से लूप करेगा। एंडी लियोनार्ड ने अपनी सीढ़ी श्रृंखला में एक परिचय दिया है ।


0

हो सकता है, नया डेटाबेस बनाने के बजाय, असली डेटाबेस को नए डेटाबेस में पुनर्स्थापित करें और नवीनतम, 12-13 महीने के डेटा को हटा दें। फिर अपने वास्तविक डेटाबेस में उस डेटा को हटा दें जो आपके अभी-अभी बनाए गए संग्रह क्षेत्र में समाहित नहीं है। यदि बड़ी डिलीट एक समस्या है, तो हो सकता है कि आप इसे करने के लिए स्क्रिप्ट के माध्यम से सिर्फ 10K या बड़े सेट हटा सकते हैं।

आपके विभाजन कार्य ऐसे प्रतीत नहीं होते हैं कि उनके साथ हस्तक्षेप किया जाएगा और आपके हटाए जाने के बाद या तो डेटाबेस पर लागू होगा।


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