งาน
เก็บถาวรทั้งหมดยกเว้นรอบระยะเวลา 13 เดือนจากกลุ่มของตารางขนาดใหญ่ ข้อมูลที่เก็บถาวรต้องถูกเก็บไว้ในฐานข้อมูลอื่น
- ฐานข้อมูลอยู่ในโหมดการกู้คืนอย่างง่าย
- ตารางมีขนาด 50 ล้านแถวถึงหลายพันล้านและในบางกรณีอาจใช้เวลาหลายร้อยกิกะไบต์ในแต่ละครั้ง
- ตารางไม่ได้ถูกแบ่งพาร์ติชันในปัจจุบัน
- แต่ละตารางมีหนึ่งดัชนีคลัสเตอร์ในคอลัมน์วันที่เพิ่มขึ้น
- แต่ละตารางจะมีดัชนีที่ไม่ใช่คลัสเตอร์อีกหนึ่งดัชนี
- การเปลี่ยนแปลงข้อมูลทั้งหมดในตารางเป็นการแทรก
- เป้าหมายคือเพื่อลดการหยุดทำงานของฐานข้อมูลหลัก
- เซิร์ฟเวอร์คือ 2008 R2 Enterprise
ตาราง "เก็บถาวร" จะมีประมาณ 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