반응형
반응형

앞에서 생성된 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()

SPLIT RANGE ('3/01/2004');

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()

MERGE RANGE ('11/01/2003');

GO

11.   TransactionHistoryArchive 테이블의 2003 9 파티션을 첫번째 파티션과 통합합니다.

ALTER PARTITION FUNCTION ArchivePF2()

MERGE RANGE ('10/01/2003');

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

 

[참고] 분할 테이블 인덱스는 Microsoft SQL Server 2005 Enterprise Edition Developer Edition에서만 지원됩니다.
반응형

+ Recent posts

반응형