Bài tập
Lưu trữ tất cả trừ một khoảng thời gian 13 tháng từ một nhóm các bảng lớn. Dữ liệu lưu trữ phải được lưu trữ trong cơ sở dữ liệu khác.
- Cơ sở dữ liệu ở chế độ phục hồi đơn giản
- Các bảng là 50 triệu hàng đến vài tỷ và trong một số trường hợp chiếm hàng trăm gb mỗi bảng.
- Các bảng hiện không được phân vùng
- Mỗi bảng có một chỉ mục được nhóm trên một cột ngày càng tăng
- Mỗi bảng cũng có một chỉ mục không được nhóm
- Tất cả các thay đổi dữ liệu cho các bảng được chèn
- Mục tiêu là để giảm thiểu thời gian chết của cơ sở dữ liệu chính.
- Máy chủ là 2008 R2 Enterprise
Bảng "lưu trữ" sẽ có khoảng 1,1 tỷ hàng, bảng "trực tiếp" khoảng 400 triệu. Rõ ràng bảng lưu trữ sẽ tăng theo thời gian, nhưng tôi hy vọng bảng trực tiếp cũng tăng nhanh một cách hợp lý. Nói ít nhất 50% trong vài năm tới.
Tôi đã nghĩ về cơ sở dữ liệu mở rộng Azure nhưng thật không may, chúng tôi đang ở 2008 R2 và có khả năng ở lại đó một thời gian.
Kế hoạch hiện tại
- Tạo một cơ sở dữ liệu mới
- Tạo các bảng mới được phân vùng theo tháng (sử dụng ngày sửa đổi) trong cơ sở dữ liệu mới.
- Di chuyển 12-13 tháng gần đây nhất của dữ liệu vào các bảng được phân đoạn.
- Thực hiện đổi tên hai cơ sở dữ liệu
- Xóa dữ liệu đã di chuyển khỏi cơ sở dữ liệu "lưu trữ" hiện tại.
- Phân vùng từng bảng trong cơ sở dữ liệu "lưu trữ".
- Sử dụng hoán đổi phân vùng để lưu trữ dữ liệu trong tương lai.
- Tôi nhận ra rằng tôi sẽ phải trao đổi dữ liệu sẽ được lưu trữ, sao chép bảng đó vào cơ sở dữ liệu lưu trữ và sau đó trao đổi nó vào bảng lưu trữ. Điều này được chấp nhận.
Vấn đề: Tôi đang cố gắng di chuyển dữ liệu vào các bảng được phân vùng ban đầu (thực tế tôi vẫn đang làm bằng chứng về khái niệm về nó). Tôi đang cố gắng sử dụng TF 610 (theo Hướng dẫn hiệu suất tải dữ liệu ) và một INSERT...SELECT
tuyên bố để di chuyển dữ liệu ban đầu nghĩ rằng nó sẽ được ghi lại tối thiểu. Thật không may mỗi khi tôi thử nó đã đăng nhập đầy đủ.
Tại thời điểm này, tôi nghĩ rằng cách tốt nhất của tôi có thể là di chuyển dữ liệu bằng gói SSIS. Tôi đang cố gắng tránh điều đó vì tôi đang làm việc với 200 bảng và bất cứ điều gì tôi có thể làm theo kịch bản tôi có thể dễ dàng tạo và chạy.
Có bất cứ điều gì tôi thiếu trong kế hoạch chung của mình không và SSIS có phải là lựa chọn tốt nhất của tôi để di chuyển dữ liệu nhanh chóng và sử dụng tối thiểu nhật ký (mối quan tâm về không gian) không?
Mã demo không có dữ liệu
-- 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
Di chuyển mã
USE Audit_New
GO
DBCC TRACEON(610);
INSERT INTO AuditTable
SELECT * FROM Audit.dbo.AuditTable
WHERE Modified >= '6/1/2015'
ORDER BY Modified