태스크
큰 테이블 그룹에서 롤링 13 개월을 제외한 모든 것을 아카이브하십시오. 보관 된 데이터는 다른 데이터베이스에 저장해야합니다.
- 데이터베이스가 단순 복구 모드입니다
- 테이블은 5 천만 행에서 수십억 개이며 경우에 따라 각각 수백 GB를 차지합니다.
- 테이블이 현재 파티션되지 않았습니다
- 각 테이블에는 계속 증가하는 날짜 열에 하나의 클러스터형 인덱스가 있습니다.
- 각 테이블에는 추가적으로 하나의 비 클러스터형 인덱스가 있습니다
- 테이블에 대한 모든 데이터 변경 사항은 삽입입니다.
- 목표는 기본 데이터베이스의 가동 중지 시간을 최소화하는 것입니다.
- 서버는 2008 R2 Enterprise입니다
"보관"테이블에는 약 11 억 개의 행이 있고 "실제"테이블에는 약 4 억 개의 행이 있습니다. 분명히 아카이브 테이블은 시간이 지남에 따라 증가하지만 라이브 테이블도 합리적으로 빠르게 증가 할 것으로 기대합니다. 다음 몇 년 동안 50 % 이상이라고 말하십시오.
Azure 확장 데이터베이스에 대해 생각했지만 불행히도 우리는 2008 R2에 있으며 잠시 동안 머물러있을 것입니다.
현재 계획
- 새로운 데이터베이스 생성
- 새 데이터베이스에서 월별로 분할 된 새 테이블을 작성하십시오 (수정 된 날짜 사용).
- 가장 최근 12-13 개월의 데이터를 파티션 된 테이블로 이동하십시오.
- 두 데이터베이스의 이름 바꾸기 스왑을 수행하십시오.
- 이제 "아카이브"데이터베이스에서 이동 된 데이터를 삭제하십시오.
- "아카이브"데이터베이스에서 각 테이블을 파티션하십시오.
- 파티션 스왑을 사용하여 나중에 데이터를 보관하십시오.
- 보관할 데이터를 교체하고 해당 테이블을 보관 데이터베이스에 복사 한 다음 보관 테이블로 교체해야한다는 것을 알고 있습니다. 허용됩니다.
문제 : 데이터를 초기 분할 테이블로 옮기려고합니다 (사실 여전히 여전히 개념 증명을하고 있습니다). TF 610 ( Data Loading Performance Guide에 따라 )과 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