본문 바로가기

Dev_Language/DB

MS-SQL 2005 피티션 스위칭

파티션된 테이블을 관리하다 보면 오래된 정보들은 사용을 많이 안하게 된다.
이러한 정보들을 따로 관리하기 위해 기존 파티션 테이블에서 빼내서 새로운 파티션 테이블에 추가하는 방법이 파티션 스위칭(슬라이딩 윈도우) 이다.

우선 월별로 나누어져 있는 파티션 테이블이 있다고 가정하에 설명하겠다.

  기존 파티션 테이블
 2009-04
 2009-05
 2009-06
 2009-07
 2009-08
 2009-09
 빈 파티션

1) 파티션 분할
기존 파티션 테이블에서 오래된 항목을 새로운 파티션으로 나누어 만든다.

ALTER PARTITION FUNCTION Partition_Function
SPLIT RANGE (Value);

Partition_Function : 파티션 함수명
Value : 새로운 구분값

위 문법을 적용한 예제는 아래와 같다.

ALTER PARTITION FUNCTION MarsterPF()
SPLIT RANGE ('2009-10');

위와 같이 기존 파티션을 나누면 2009-10 이후의 파티션이 새로 하나 생성이 된다.

마찬가지로 History 파티션도 새로 추가할 파티션을 하나 새로 생성한다.

HIstory 파티션 테이블
 2009-03
 빈 파티션

ALTER PARTITION FUNCTION HistoryPF()
SPLIT RANGE ('2009-04');

여기에는 기존 파티션에 가장 오래된 파티션의 기준값과 동일하게 정한다.

2) 파티션 스위칭
각각의 파티션 테이블에 새로운 파티션을 생성했으니 이제는 기존 파티션 테이블에서 History 파티션 테이블로
데이타를 옴겨야 한다.

ALTER TABLE Master_Table_Name
SWITCH PARTITION Marster_Partition_Number to
History_Table_Name PARTITION History_Partition_Number

Marster_Table_Name : 기존 파티션 테이블명
Marster_Partition_Number : History 파티션 테이블로 보낼 파티션 번호
History_Table_Name : History 파티션 테이블명
History_Partition_Number : History 파티션 테이블에 추가될 파티션 번호

위 문법을 적용한 예제는 다음과 같다.

ALTER TABLE [tempdb].[TestCalender]
SWITCH PARTITION 1 to
[tempdb].[HIstoryTestCalender] PARTITION 2

위와 같이 기존 파티션 테이블에서 가장 오래된 1 번 파티션을 History 파티션 테이블의 2번 파티션으로 옮긴다.
실제 옮길때는 메타데이타만 이동하기 때문에 시간이 오래 걸리지는 않는다.

3) 파티션 병함
마지막으로 기존 파티션 테이블에서 History 파티션 테이블로 이동한 파티션은 비워져있기 때문에 해당 파티션을 병합한다.

ALTER PARTITION FUNCTION Partition_Function
MERGE RANGE (Value);

Partition_Function : 파티션 함수명
Value : 오래된 구분값

위 문법을 적용한 예제는 아래와 같다.

ALTER PARTITION FUNCTION MarsterPF()
MERGE RANGE ('2009-04');

위와 같이 가장 오래된 파티션 테이블을 병합하면 해당 파티션은 사라진다.

마찬가지로 History 파티션도 오래된 파티션은 병합을 한다. 하지만 History 파티션 테이블도 기준값(월별)별로 관리를 할려면
병합을 하지 않아도 된다.
병합을 하지 않은경우 파티션 스위칭 시 History 파티션 번호를 잘 확인해야 한다.

병합전에는 항상 sys.partition_range_values 라는 테이블로 항상 파티션 테이블을 확인해보고 병합한다.