파티션된 인덱스는 각각 단일 데이터 파티션에 대한 인덱스 항목을 포함하는 인덱스 파티션 세트로 구성됩니다. 각 인덱스 파티션에는 대응하는 데이터 파티션의 데이터에 대한 참조만 들어있습니다. 시스템 및 사용자 생성 인덱스가 둘 다 파티션될 수 있습니다.
파티션된 인덱스는 다음과 같은 경우에 유용합니다.
ALTER TABLE문의 ATTACH PARTITION 또는 DETACH PARTITION절을 사용하여 파티션된 테이블의 데이터를 롤인 또는 롤아웃 중입니다. 파티션되지 않은 인덱스가 있는 경우, 새로 첨부된 파티션의 데이터를 사용하기 전에 실행해야 하는 SET INTEGRITY 문은 시간이 걸릴 수 있으며 대량의 로그 공간을 필요로 합니다. 파티션된 인덱스를 사용하는 테이블 파티션을 첨부하면, SET INTEGRITY문을 발행하여 태스크(범위 유효성 확인 및 제한조건 검사)를 수행해야 합니다.
Tip: 범위 유효성 검사 및 기타 제약 조건 검사를 포함한 데이터 무결성 검사를 첨부 작업 전에 데이터 서버와 독립적인 애플리케이션 로직을 통해 수행할 수 있다면 새로 첨부된 데이터를 훨씬 더 빨리 사용할 수 있습니다. SET INTEGRITY를 사용하여 데이터 롤인 프로세스를 최적화할 수 있습니다.ALL IMMEDIATE UNCHECKED문은 범위를 건너뛰고 제한조건 위반 검사를 수행합니다. 이 경우 대상 테이블에 파티션되지 않은 사용자 인덱스가 없는 한, 테이블은 SET INTEGRITY 보류 중 상태를 벗어나고 애플리케이션이 바로 새 데이터를 사용할 수 있습니다.
소스 테이블의 인덱스가 대상 테이블의 인덱스를 분할하는 경우 일치 인덱스 유지 관리와 관련된 성능 및 로그 처리가 발생하지 않으며, 새로 롤인된 데이터는 분할되지 않은 인덱스를 사용할 때보다 더 빠르게 액세스할 수 있습니다.
인덱스 재구성이 필요한 특정 파티션의 데이터에 대한 유지보수를 수행 중입니다. 예를 들어, 각각 특정 월에 해당하는 12개의 파티션이 있는 테이블을 고려하십시오. 한 월에 특정한 여러 행을 갱신하거나 삭제해야 할 수도 있습니다. 이 조치로 인해 인덱스 재구성을 수행해야 하는 분할된 인덱스가 발생할 수 있습니다. 파티션된 인덱스가 있는 경우, 변경된 데이터 파티션에 해당하는 인덱스 파티션만 재구성할 수 있으며 이는 파티션되지 않은 인덱스 전체를 재구성하는 것에 비해 상당한 시간을 절약할 수 있습니다.
파티션할 수 없는
몇 가지 유형의 인덱스가 있습니다.
파티션되지 않은 데이터에 대한 인덱스
공간 데이터에 대한 인덱스
XML 컬럼 경로 인덱스(시스템 생성)
이러한 인덱스를 항상 파티션되지 않은 인덱스로 작성해야 합니다. 또한 파티션된 고유 인덱스에 대한 인덱스 키는 사용자 생성이든
시스템 생성이든 간에 테이블 파티션 키의 모든 컬럼을 포함해야
합니다. 후자는 데이터에 대한 고유성 또는 기본 제한조건을 강제하기
위해 시스템이 작성하는 인덱스의 경우입니다.
이 예에서, 테이블 A의 모든 데이터 파티션 및 테이블 A에 대한 모든 인덱스 파티션은 단일 테이블스페이스에 있습니다. 인덱스 파티션은 해당 파티션이 연관되는 데이터 파티션에 있는 행만을 참조합니다. (인덱스가 모든 데이터 파티션 사이의 모든 행을 참조하는 파티션되지 않은 인덱스와 파티션된 인덱스를 비교하십시오). 또한 데이터 파티션에 대한 인덱스 파티션은 동일한 인덱스 오브젝트에 있습니다. 인덱스 및 인덱스 파티션의 이 특정 배열은 다음 명령문과 같은 명령문을 사용하여 설정됩니다.
CREATE TABLE A (columns) in ts1
PARTITION BY RANGE (column expression)
(PARTITION PART0 STARTING FROM constant ENDING constant,
PARTITION PART1 STARTING FROM constant ENDING constant,
PARTITION PART2 STARTING FROM constant ENDING constant,
CREATE INDEX x1 ON A (...) PARTITIONED;
CREATE INDEX x2 ON A (...) PARTITIONED;
그림 2는 분할 인덱스의 또 다른 예를 보여줍니다.그림 2. 서로 다른 테이블스페이스에 데이터 파티션과 인덱스 파티션을 갖는 파티션된 인덱스.
이 예에서, 테이블 A에 대한 데이터 파티션은 두 개의 테이블스페이스 TS1 및 TS3에 분산되어 있습니다. 인덱스 파티션도 서로 다른 테이블스페이스에 있습니다. 인덱스 파티션은 해당 파티션이 연관되는 데이터 파티션에 있는 행만을 참조합니다. 인덱스 및 인덱스 파티션의 이 특정 배열은 다음 명령문과 같은 명령문을 사용하여 설정됩니다.
CREATE TABLE A (columns)
PARTITION BY RANGE (column expression)
(PARTITION PART0 STARTING FROM constant ENDING constant IN ts1 INDEX IN ts2,
PARTITION PART1 STARTING FROM constant ENDING constant IN ts3 INDEX IN ts4,
PARTITION PART2 STARTING FROM constant ENDING constant IN ts3,INDEX IN ts5)
CREATE INDEX x1 ON A (...);
CREATE INDEX x2 ON A (...);
이 경우, PARTITIONED절이 CREATE INDEX문에서 생략되었습니다. 인덱스는 여전히 파티션된 인덱스로 작성되며, 이 설정이 파티션된 테이블에 대한 기본값이기 때문입니다.
그림 3 다이어그램은 파티션되지 않은 인덱스와 파티션된 인덱스가 모두 있는 파티션된 테이블의 예를 보여 줍니다.그림 3. 파티션된 테이블에 대한 파티션되지 않은 인덱스와 파티션된 인덱스의 조합
이 다이어그램에서 인덱스 X1은 테이블 T1의 모든 파티션을 참조하는 파티션되지 않은 인덱스입니다. 인덱스 X2 및 X3은 다양한 테이블스페이스에 상주하는 파티션된 인덱스입니다. 인덱스 및 인덱스 파티션의 이 특정 배열은 다음 명령문과 같은 명령문을 사용하여 설정됩니다.
CREATE TABLE t1 (columns) in ts1 INDEX IN ts2 1
PARTITION BY RANGE (column expression)
(PARTITION PART0 STARTING FROM constant ENDING constant IN ts3, 2
PARTITION PART1 STARTING FROM constant ENDING constant INDEX IN ts5,
PARTITION PART2 STARTING FROM constant ENDING constant INDEX IN ts4,
PARTITION PART3 STARTING FROM constant ENDING constant INDEX IN ts4,
PARTITION PART4 STARTING FROM constant ENDING constant)
CREATE INDEX x1 ON t1 (...) NOT PARTITIONED;
CREATE INDEX x2 ON t1 (...) PARTITIONED;
CREATE INDEX x3 ON t1 (...) PARTITIONED;
다음을 주의하십시오.
이 위치는 X1 테이블에 대한 분할되지 않은 인덱스의 기본 지정 위치( 1 참조)이기 때문에 테이블 공간 TS2에 분할되지 않은 인덱스가 저장됩니다.
인덱스 파티션의 기본 위치가 참조하는 데이터 파티션과 동일하기 때문에 데이터 파티션 0(Part0)에 대한 인덱스 파티션은 테이블 공간 TS3에 저장됩니다( 2 참조).
Part4는 TS1에 저장되며, 이는 T1 테이블의 데이터 파티션의 기본 테이블 공간입니다( 1 참조); 인덱스 파티션의 기본 위치가 참조하는 데이터 파티션과 동일하기 때문에 이 데이터 파티션의 인덱스 파티션도 TS1에 상주합니다.
중요: 파티션이 없는 인덱스와 달리, 파티션이 있는 인덱스에서는 CREATE INDEX 문의 INDEX IN 절을 사용하여 인덱스 파티션을 저장할 테이블 공간을 지정할 수 없습니다. 인덱스 파티션에 대한 기본 스토리지 위치를 겹쳐쓰는 유일한 방법은 테이블을 작성할 때 CREATE TABLE문의 파티션 레벨 INDEX IN절을 사용하여 위치를 지정하는 것입니다. 테이블 레벨 INDEX IN절은 인덱스 파티션 배치에 아무 효과도 없습니다.
CREATE INDEX문에 PARTITIONED 옵션을 포함시켜서 파티션된 테이블에 대한 파티션된 인덱스를 작성합니다. 예를 들어, 테이블 파티션 키로 sales_date을(를) 사용하여 파티션된 SALES 테이블의 경우, 파티션된 인덱스를 작성하려면 다음 명령문과 같은 명령문을 사용할 수 있습니다.
CREATE INDEX partIDbydate on SALES (sales_date, partID) PARTITIONED
파티션된 고유 인덱스를 작성하려는 경우 테이블 파티션 컬럼이 인덱스 키 컬럼에 포함되어야 합니다. 그러므로 앞의 예에서 다음 명령문을 사용하여 파티션된 인덱스를 작성하려고 시도한 경우,
CREATE UNIQUE INDEX uPartID on SALES (partID) PARTITIONED
테이블 파티션 키를 형성하는 컬럼 sales_date이(가) 인덱스 키에 포함되어 있지 않기 때문에 명령문이 실패합니다.
파티션된 테이블에 대한 인덱스를 작성할 때 PARTITIONED 키워드를 생략하면, 데이터베이스 관리자는 다음 경우를 제외하고 기본적으로 파티션된 인덱스를 작성합니다.
고유 인덱스를 작성 중이고, 인덱스 키에 모든 테이블 파티션 키가 포함되지 않는 경우
이 주제의 시작에서 파티션된 인덱스로서 작성될 수 없는 것으로 설명한 인덱스 유형 중 하나를 작성 중인 경우.
이러한 경우 중 하나에는 인덱스가 파티션되지 않은 인덱스로 작성됩니다.
기존 파티션되지 않은 인덱스의 정의와 일치하는 정의를 사용하여 파티션되지 않은 인덱스를 작성하면 SQL0605W가 리턴되지만, 파티션된 인덱스는 유사한 정의가 있는 파티션되지 않은 인덱스와 공존할 수 있습니다. 이 공존은 파티션된 인덱스를 더 쉽게 채택할 수 있도록 하기 위해서입니다.