앞에서 생성된 Production.TransactionHistory 테이블은 운영 서버에 존재하는 테이블이며, Production.TransactionHistory 테이블의 데이터는 1개월이 지나면 가장 오래된 한 달치의 데이터를 Production.TransactionHistoryArchive 테이블에 복사한 다음에, 복사가 완료된 1개월 분의 데이터를 Production.TransactionHistory 테이블에서 삭제한다고 가정합니다. 이런 경우, 파티션을 이용하면 실제로 데이터를 이동시킬 필요가 없으므로 데이터를 이동시키는 시간을 줄일 수 있습니다. 다음은 위의 시나리오에 따른 스크립트 예제이고, 이것을 슬라이딩 윈도우 기법이라고 합니다.
슬라이딩 윈도우 구현하기 |
1. 운영에서 삭제된 데이터를 보관하기 위한 Production.TransactionHistoryArchive 테이블을 분할된 테이블로 생성하기 위하여 파티션 함수를 생성합니다. CREATE PARTITION FUNCTION [TransactionArchivePF2] (datetime) AS RANGE RIGHT FOR VALUES ('10/01/2003'); GO 2. Production.TransactionHistoryArchive 테이블의 파티션 스키마를 생성합니다. CREATE PARTITION SCHEME ArchivePS2 AS PARTITION ArchivePF2 TO (AdventureWorks_FG1, AdventureWorks_FG1); GO 3. Production.TransactionHistoryArchive 분할된 테이블을 생성합니다. CREATE TABLE TransactionHistoryArchive( TransactionID int NOT NULL, ProductID int NOT NULL, ReferenceOrderID int NOT NULL, ReferenceOrderLineID int NOT NULL CONSTRAINT DF_ReferenceOrderLineID DEFAULT (0), TransactionDate datetime NOT NULL CONSTRAINT DF_TransactionDate DEFAULT (GETDATE()), TransactionType nchar(1) NOT NULL, Quantity int NOT NULL, ActualCost money NOT NULL, ModifiedDate datetime NOT NULL CONSTRAINT DF_ModifiedDate DEFAULT (GETDATE()) ) ON ArchivePS2 (TransactionDate); GO 4. Production.TransactionHistoryArchive 테이블에 분할된 인덱스를 생성합니다. ALTER TABLE TransactionHistoryArchive WITH CHECK ADD CONSTRAINT PK_TransactionHistoryArchive PRIMARY KEY CLUSTERED ( TransactionDate, TransactionID ) ON ArchivePS2 (TransactionDate); GO 5. 분할된 테이블의 정보를 확인합니다. SELECT OBJECT_NAME(object_id), * FROM sys.partitions WHERE object_id = OBJECT_ID('TransactionHistoryArchive') ORDER BY partition_number, index_id; GO 6. 파티션 스키마를 지정한 파일 그룹에 추가합니다. ALTER PARTITION SCHEME HistoryPS1 NEXT USED AdventureWorks_FG2; GO 7. TransactionHistory 테이블의 끝에 새로운 파티션을 추가합니다. ALTER PARTITION FUNCTION HistoryPF1() GO 8. 스위칭을 하기 전에 TransactionHistory 테이블에 CHECK 제약 조건을 추가하여 데이터의 오류를 확인합니다. ALTER TABLE TransactionHistory ADD CONSTRAINT CK_TransactionHistory_DateRange CHECK (TransactionDate >= '10/01/2003'); GO 9. TransactionHistory 테이블에서 TransactionHistoryArchive 테이블로 데이터를 이동시킵니다. ALTER TABLE TransactionHistory SWITCH PARTITION 1 TO TransactionHistoryArchive PARTITION 2; GO 10. TransactionHistory 테이블의 2003년 10월 파티션을 통합합니다. ALTER PARTITION FUNCTION HistoryPF1() GO 11. TransactionHistoryArchive 테이블의 2003년 9월 파티션을 첫번째 파티션과 통합합니다. ALTER PARTITION FUNCTION ArchivePF2() GO 12. TransactionHistory 테이블의 제약 조건을 제거합니다. ALTER TABLE TransactionHistory DROP CONSTRAINT CK_TransactionHistory_DateRange; GO 13. 테이블의 파티션과 데이터를 확인합니다. SELECT OBJECT_NAME(object_id), * FROM sys.partitions WHERE object_id = OBJECT_ID('TransactionHistory') ORDER BY partition_number, index_id; GO SELECT OBJECT_NAME(object_id), * FROM sys.partitions WHERE object_id = OBJECT_ID('TransactionHistoryArchive') ORDER BY partition_number, index_id; GO |
'연구개발 > SQL2005' 카테고리의 다른 글
[SQL 2005 GUIDE] 성능 로그 수집하기 (0) | 2009.07.23 |
---|---|
[SQL 2005 GUIDE] 로그전달 구성하기 (0) | 2009.07.23 |
[SQL 2005 GUIDE] 분할 (0) | 2009.07.23 |
[SQL 2005 GUIDE] DBCC 명령어 (3) (0) | 2009.07.22 |
[SQL 2005 GUIDE] DBCC 명령어 (2) (0) | 2009.07.22 |