कार्य
सभी को हटा दें, लेकिन बड़ी तालिकाओं के समूह से एक रोलिंग 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