파티션 테이블에 Unique 고찰

Unique 컬럼은 집합에서 모든 ROW 사이에  서로 다름을 보장해주는 컬럼 or 컬럼들이다. 
물리적으로는 Unique Index가 그 역할을 하고 있다. 

Partitioned Table에서 Unique를 생각해 보았다. 

아래 3가지 Unique 경우의 수가 있다.

 

1) Unique Non-Partititioned Index
 - "전체" 대상 집합으로 Unique 하게 해준다. 

2) Unique Local-Partitioned Index 
 - Local 이라서 파티션 당 Unique함을 표현하는 것 같다.
   하지만 "전체" 기준에서 Unique 하면, 파티션에서도 당연히 Unique 해진다.
   그러므로 Unique Index 안에는 필수로 "파티션 키"가 포함되어야 한다. 
   ( 파티션 키가 포함 되지 않으면 DB에서 ERROR 발생 됨 )

3) Unique Global-Partitioned Index
 - Global은 테이블 파티션 키 기준을 따라 갈 수 도 있고, 별도로 파티션 키를 지정할 수 있다.
   하지만, "전체" 집합 차원에서 Unique 함을 유지 해야하는 것은 변함이 없다.
   그러므로 "파티션 키"가 Unique Index에 포함 되어야 한다.
   ( 파티션 키가 포함 되지 않으면 DB에서 ERROR 발생 됨 )

 

결국, Unique는 전체 집합에서 Unique 해야한다는 의미이다. 
그래서 파티션 테이블에서 집합이 Unique 해야하다보니, 파티션키가 Unique 컬럼에 속하는 것이다. 

 

위는 기술적이고 마치 외워야 할 것만 같은 기분이나. 간단히 데이터로 생각하면 매우 간단한 일이다.


고객번호 , 입력일자  (파티션키 - 월 파티션 )
 000001 20220101 
 000001 20230101 

업무 프로세스상 지극히 정상적인 Unique 컬럼을 유지할려면 "파티션 키"가 반드시 포함 될 수 밖에 없다. 

파티션키가 없다면 00001은 집합에 1건만 들어온다. 이건 문제일수 밖에 없다. 

 

예외적으로  월마다 고객번호는 1건만 와야 한다는 것이 있다면,

Unique  Index 컬럼 구성이  "고객번호, ( 입력일자, 1 ,6  )" 로 구성 되어야 한다. 

 

이는 "년월일"  컬럼을 파티션키로 한 파티션 테이블에서는 "Local Partitoned Index"와 "Globa Partitnoied Index"

처리로는 불가능하다. 파티션 키를 변형시킬수 없기 때문이다. 

 

이때는 다음과 같이 비파티션 인덱스로 만들어야 한다. 

CREATE UNIQUE INDEX 인덱스명 ON 테이블명 ( 고객번호, SUBSTR(입력일자,1,6));

그래도 결국 입력일자라는 파티션키명을 쓴것이다. 

 

정리하면 파티션 테이블과 상관 없이 Unique 함을 생각하면 고객번호와 입력일자를 지정해야 한다.

이 또한 입력일자로 된 경우는 고객이 1일 당 1번 구매가 가능한 내역이다. 

업무 프로세스상 말이 안된다. 그러므로 일력일자가 아닌 입력일시로 변경해야 한다. 

 

너무 기술적으로 테이블 파티션과 인덱스 파티션에 생각이 많아서 편협하게 생각이 많았다.

집합을 생성하는데 있어 Unique 함을 먼저 생각 해보는것이 본질적으로 우선 되어야 함을 느낀 순간이다. 

'ORACLE > DBA' 카테고리의 다른 글

Toad ArraySize 조정 방법  (0) 2024.04.24
PK 컬럼을 포함하는 일반 인덱스를 만들어도 될까?  (0) 2024.04.16
시퀀스 초기화 방법  (0) 2024.04.12
SQL Cursor Flush 방법  (0) 2024.04.11
문제로 풀어보는 Partitioned Index  (0) 2024.04.06