행위

"파티션 테이블 인덱스"의 두 판 사이의 차이

DB CAFE

(Local Prefixed Index)
1번째 줄: 1번째 줄:
== 파티션 테이블에 생성하는 인덱스 4가지  ==
+
==== 파티션 인덱스 (Partitioned Index) ====
* partition table에 index생성시 4가지 방법이 있습니다.
+
# Partitioned Index는 Partitioned Table에서만 쓰이는것으로 잘못된 생각임.
# Local prefixed partitoned index
+
# Partitioned Index는 Partitioned Table과 별개의 것이며 단지 많은 상호 연관을 가지고 있을 뿐이다.
# Local non-prefixed partitoned index
+
# Partitioned Index는 말 그대로 Index가 Partitioning 된 것으로 Base Table이 Partitioned Table이든 Non-Partitioned Table이든 상관없이 Partitioned Index를 만들 수 있다.
# Global prefixed non-partitoned index
 
# Global prefixed partitoned index
 
  
=== Local Prefixed Index ===
+
* 일반테이블로 파티션 인덱스 만드는 예시)  
# Index Column의 구성에서 선두 Column이 Partition Key Column인 Index 임.
 
# 이 Partition Key는 Local Index가 본 Table 과 Equipartitioning 되어 있으므로 Table의 Partition Key와 동일.
 
## 즉, 각 Table Partition에 Row가 Partition Key 값에 따라 분산되어 있고,
 
## Index는 각 Partition에 분리된 값의 기준(Partitioning Key)에 따라 정렬되어 Index가 구성된다.
 
:* Index 생성 시 PREFIXED를 지정하지 않더라도 Dictionary정보를 검색해 보면 DBMS가 Index의 선두 Column을 조사하여 PREFIXED로 지정함을 알 수 있다.
 
:* 또한 위의 Index 생성 몇 개의 Partition으로 나누어 지는지 지정하지 않아도 된다
 
:* 그러나 이부분 역시 "Local" Option으로 인해서 DBMS가 동일한 수의 Partition으로 나누었고 각 Index의 Partitioning Bound역시 Table의 Partitioning Bound와 동일하게 설정하였음을 Dictionary를 조사해 보면 알 수 있다. 즉 스스로 Equipartitioning 된 것임을 알수 있음.
 
:* USER_PART_INDEXES, USER_IND_PARTITIONS, USER_TAB_PARTITIONS를 조회하여 확인.
 
  
=== Local Non-prefixed Index ===
+
EMP테이블의 Size가 상당히 크고 Non-Partitioned Table(그냥 일반 Table)일 경우 Index를 Partitioned Index로 만들고자 한다면 다음과 같이 할 수 있다
# Index의 선두 Column이 Partition Key Column으로 시작하지 않는 Local Index 임.
 
# Partition Key Column이 Index에 중간에 올 수도 있지만 항상 선두에 오지 않는 한 Non-prefixed index임.
 
# 즉 Local Prefixed Index와 다른 점은 두 Index Type 모두 Partition Key에 따라 동일한 범위에 값을 가지고 있지만 Local Prefixed Index는 Partition Key를 기준으로 정렬되어 있는 반면, '''Non-prefixed Index는 정렬기준이 Partition Key가 아니라는 점'''.
 
# Local Non-prefixed Index는 Unique Index가 되려면 Index column에 Partition Key Column을 포함하고 있어야 하는 제약을 안고 있다.
 
#: - 이러한 제약으로 인해 Partition Key가 포함되지 않은 Column들로 Unique Index를 만들고자 할 경우는 Global Index로 만들어야 한다.
 
# Local Non-prefixed Index는 Table과 Equipartitioning 되어 있어 가용성, 관리의 용이성을 제공하면서도 Partition Key 이외의 Column에 의한 조건 검색시 Partition별 처리를 수 있으므로 Historical Table에서 유용하게 사용되어 질 수 있다.
 
# Local Non-prefixed Index는 Index의 선두 Column이 Table Partition Key와 다를 뿐이며 생성하는 것은 Local Prefixed Index와 동일 함.
 
  
=== Global Prefixed Partitioned Index ===
+
<source lang=sql>
# Global index는 local index에 비하여 생성시, 전체적인 활용 측면 및 영향을 충분히 고려하여 설계하고 생성해야 한다.  
+
CREATE INDEX EMP_IDX1
# 본 Table의 특정 Partition이 Drop된 경우 Global Index의 특정 Partition에만 영향이 있다고 간주 할 수 없기 때문에 모든 Global Index에 영향을 미친다.
+
    ON EMP (DEPTNO) GLOBAL PARTITION BY RANGE (DEPTNO)
# Partition table의 경우 일정기간동안 데이타를 On-line으로 유지하고 그 기간이 지난 데이타는 백업받은 후 해당 Partition을 Drop하게 되는데 Global Index는 Partitioned Table에 대해서 Partition별 독립성이 없기 때문에 이 경우에는 전체 Index에 대해 수정 사항이 반영되도록 Rebuild작업을 해주어야 한다.
+
(PARTITION PAR_10 VALUES LESS THAN ('20') TABLESPACE TBS1,
# Partitioned Table에서는 대부분의 경우 Local Index가 성능이나, 가용성 및 관리의 용이성이 Global Index 보다 우수하다.
+
PARTITION PAR_20 VALUES LESS THAN ('30') TABLESPACE TBS2,
# 그러나 업무의 특성 및 기타 Access 의 형태에 따라 Partition Index를 만들고자 하나 Local Index를 생성할 없는 경우에 Global Index를 고려한다.
+
PARTITION PAR_30 VALUES LESS THAN ('40') TABLESPACE TBS3,
#: - 가령 Partition Key를 포함하지 않으면서 몇 개의 Column이 결합된 Unique Index를 만들어야 때,
+
PARTITION PAR_40 VALUES LESS THAN ('50') TABLESPACE TBS4,
#: - 또는 Index 선두 Column을 구성하는 Column이 업무적으로 또는 Access 형태별로 분리가 확실하여 Partition 되는 Index가 너무 많지 않게 생성할 있을 경우
+
PARTITION PAR MAX VALUES LESS THAN (MAXVALUE) TABLESPACE TBS5)
# Global Prefixed Partitioned Indexes는 Global 인덱스가 Partitioned 되어 있는 경우이며 관리측면을 고려하여 관리가 용이한 레벨에서 파티션을 고려하면 된다.  
+
</source>
# 그리고 파티션 단위는 테이블의 파티션 조각들과 1:1 맵핑될 필요 없으나 너무 많은 파티션으로 구성하면 넓은 범위 Index Range Scan시 인덱스 Jumping 현상이 생길 있으므로 주의하여야한다.
+
* 위 인덱스는 'Global Prefixed Partitioned Index’라 부른다.
# 만일 Global인덱스를 Local Indexes와 같이 파티션 조각들과 일치하는 Equi-Global Partitioned Indexed를 생성한 경우는 Oracle은 이를 이용하여 실행계획을 세우거나, DDL문이 실행된 경우 Local Index와 같은 Partitioning의 이점을 활용하지 못하므로 유의하여야 한다.
+
 
 +
==== Partitioned Index 와 Non-Partitioned Index ====
 +
===== 차이점 =====
 +
# Partitioned Table과 Non-Partitioned Table의 차이점과 동일.
 +
# Index의 경우 Indexed Column과 Rowid 순으로 Value가 Sorting이 되어 있는데, 이런 특성은 Partitioning과는 무관하다.  
 +
# Partitioned Index는 전체 Table에 대하여 Value의 Sorting이 보장되지 않는다라고 생각하고 있지만 이것은 사실과 다르며,
 +
# Global Partitioned Index의 경우는 Value가 전체 Table에 대하여 Sorting이 보장 되어 있으며 Index에 대한 관리도 Partition별로 독립적으로 할 수 있다.(이것은 Base Table의 Partitioning과는 무관한 것이다.)
 +
===== Non-Partitioned Index와 Partitioned Index의 구조 =====
 +
[[파일:IMG_8385.jpg]]
 +
* 그림설명
 +
# 위의 그림에서 Non-Partitioned Index는 하나의 Root Node에서 Leaf Node까지 전체적인 Balance를 유지하는 구조
 +
# Partitioned Index는 Partition별로 독립적인 Root Node와 Leaf Node를 가지고 각각의 Balance를 유지하는 구조
 +
# 따라서 대용량의 Table에서 Global Index의 Depth는 굉장히 깊어질 수 있다.
 +
# Partitioned Index는 각각의 Partition별 Depth가 Non-Partitioned Index보다 얕아지고 Index의 관리도 Partition별로 할 수 있어 Parallel Processing에 의한 Index Management에 매우 효과적이다.
 +
# Partitioned Index의 경우 Index Partition Key가 해당 검색 조건에 들어올 때만이 해당 Index Partition을 Search하여 효과를 볼 수 있고 만약, Partitioned Index에 Index Partition Key가 해당 검색 조건에 들어오지 않으면 전체의 Partition에 대해서 Index를 Lookup할 수 밖에 없다.
 +
# 따라서 Local Index의 경우는 Index Partition Key와 Base Table의 Partition Key가 동일하므로 검색 조건에 이 Index Partition Key가 들어오지 않으면 전체의 Partition에 대해서 반복적인 Lookup작업이 일어나게 되어 Performance 저하를 일으킬 있다.
 +
# Global Partitioned Index의 경우는 Index의 첫 번째 컬럼(leading Column)이 Index Partition Key가 되는 Prefixed Index 즉, Global Prefixed Partitioned Index로만 생성이 되기 때문에 (그 이유는 밑에서 설명) 조회 검색 조건에 이 Index를 사용하려면 첫 번째 컬럼인 Index Partition Key가 들어오지 않을 수 없다.  
 +
# 따라서 해당 Index Partition을 지정해서 Index Search를 수 있는 것이다.
 +
# 이것은 대용량 데이터 환경에서 Non-Partitioned Global Index의 Index Depth가 깊어진다는 점에서 Global Partitioned Index가 성능 면에서 우수할 있고
 +
# 또한, 인덱스 Rebuild시에도 각각의 Partition별로 Parallel Processing을 할 수 있는 장점을 가지는 것이다.
 +
 
 +
{{틀:알림
 +
|내용='''파티션 인덱스 종류'''
 +
* 로컬 인덱스(Local index)    : table partition과 동일한 index partition을 사용.
 +
** Prefixed        : index column의 left column을 사용하여 index partition을 구성.
 +
** Non-Prefixed   : index column의 left column 이외의 column을 사용하여 index partition을 구성.
 +
* 글로벌 인덱스(Global index)    : 하나의 index partition에서 둘 이상의 table partition을 지정.
 +
}}
 +
 
 +
==== 글로벌 인덱스 와 로컬 인덱스 ====
 +
# 'Partition이 되었는가? 아니면 Partition이 되어있지 않은가?’차이로 구분하는것은 잘못된 생각
 +
# 일반 테이블의 Index도 Partitioning을 할 수 있으며 Partition별로 관리를 할 있다.  
 +
# Global Index와 Local Index의 가장 근본적인 차이점은 '''정렬'''의 차이이다.
 +
# 즉, Global Index는 테이블 전체에 대하여 Indexed Column과 Rowid 순으로 Sorting이 보장된 (Optimizer가 보장하는) Index이고,  
 +
# Local Index는 테이블 전체에 대하여 Indexed Column과 Rowid 순으로 Sorting이 보장되지 않는 대신, 각각의 해당 Partition 내에서만 Sorting이 보장된 Index이다.
 +
# '''이것이 Global Index와 Local Index의 가장 큰 차이점이다.'''
 +
 
 +
=====  로컬 인덱스 (Local Index) =====
 +
# Local Index는 지역적인 Index로 Default가 Base Table의 Partition Key로 Partitioning된 Index이다.
 +
# 인덱스를 생성한 인덱스와 파티션된 인덱스가 동일하게 파티션된 형태.
 +
# Index의 구성 컬럼에 Base Table의 Partition Key가 포함이 되는가의 여부에 상관없이 Local Index의 Partition Key는 Base Table의 Partition Key가 되는 Equipartitioning된 Index인 것이다.
 +
# 인덱스와 테이블은 같은 칼럼에 의해 파티션되며, 하나의 인덱스 파티션이 테이블 파티션 하나와 대응되며, 대응되는 인덱스 파티션과 테이블 파티션은 각각 같은 범위를 갖게 됨.
 +
# 결국 특정한 하나의 인덱스에 포함된 모든 Key들은 하나의 테이블 파티션 내의 데이타만 가리킴.
 +
# Local Index에 반드시 Partition Key가 포함 되어야만 검색조건에 Partition Key가 들어왔을 때 지정된 Partition을 사용하는게 아니라 ,
 +
# Local Index에 Partition Key가 포함이 되지 않아도 검색조건에 Partition Key가 들어오면 해당 Partition을 지정하게 된다.
  
=== Global Prefixed Non-Partitioned Index ===
+
====== Local Prefixed Index ======
# 인덱스가 Partitioned 되어 있지 않은 형태로 일반적인 형태이다.
+
# 인덱스의 맨 앞에 있는 컬럼에 의해 파티션되는 방식
# Primary Key를 생성하게 되면 기본적으로 이 형태로 만들어진다.
+
# Local Prefixed Index에서 칼럼은 Unique/Non-Unique를 모두 허용
 +
# Base Table 의 파티션이 변경되면 Local Index의 관련 파티션만 변경 됨.
 
<source lang=sql>
 
<source lang=sql>
CREATE INDEX <global_partitioned> ON tb_part (prod_id) GLOBAL;
+
CREATE TABLE DEPT
 +
(
 +
DEPT NUMBER NOT NULL,
 +
DNAME VARCHAR2(10) NOT NULL,
 +
LOC VARCHAR2(14)
 +
)
 +
PARTITION BY RANGE (DEPTNO)
 +
(
 +
PARTITION PART_1 VALUES LESS THAN (30),
 +
PARTITION PART_2 VALUES LESS THAN (MAXVALUE)
 +
);
 +
 
 +
CREATE INDEX DEPT_N1 ON DEPT(DEPTNO) LOCAL;
 +
 
 
</source>
 
</source>
  
=== Local Index로 PK 구현 방안 ===
+
====== Local Non-Prefixed Index ======
# Partition table에 index를 생성할 Default로 생성되는 index type은 Golbal index이기 때문에 PK생성시 생성되는 PK unique Index도 Global index로 만들어진다.
+
# Index의 첫번째 Column이 Partition Key가 아닌 형태로 Base Table과 동일한 Partition 구조를 가진 Index(equi-partitioned)
# Local unique index를 먼저 만든 후 이를 이용하여 PK Constraint를 생성하면 PK index는 이미 만들어져 있는 Unique index를 이용하게 된다.
+
# 빠른 Access가 요구될 유용(Base Table의 Partition Key는 제외)
# 주의할 점은 Local unique index명과 PK Constraint명을 동일하게 주어야 하며 Local index가 Unique하기 위해서는 반드시 Partition key를 포함하여야 하듯이 경우도 PK컬럼에 Partition key가 포함될 경우에 사용할 있다.
+
# Partition 단위로 관리할 수 있으므로 Global Index에 비해 운영상 편리합니다.
# 이렇게 함으로서 임의의 Partition이 Drop되더라도 PK index와 Constraint를 유지할 수 있어 관리적인 측면에서 Local index의 장점을 살릴 수 있다
+
# OLAP 측면에서 Global Index보다 조회 속도가 저하.
 +
<source lang=sql>
 +
 
 +
CREATE TABLE DEPT
 +
(
 +
DEPTNO NUMBER NOT NULL,
 +
DNAME VARCHAR2(10) NOT NULL,
 +
LOC VARCHAR2(14)
 +
)
 +
PARTITION BY RANGE (DEPTNO)
 +
(
 +
PARTITION PART_1 VALUES LESS THAN (30),
 +
PARTITION PART_2 VALUES LESS THAN (MAXVALUE)
 +
);
 +
 
 +
CREATE INDEX DEPT_N2 ON DEPT(LOC) LOCAL;
 +
</source>
 +
 
 +
===== 글로벌 인덱스 (Global Index) =====
 +
# Global Index는 테이블과 다르게 파티션되는 경우
 +
# Global Index는 전역적인 Index로 Default가 Non-Partitioned Index이다.
 +
# Global Index를 Partitioning해서 사용을 할 생각이 없는 듯 하다.
 +
# 대용량의 테이블에서 Index 관리의 효율성을 높이고 Index Search의 Performance를 향상시키기 위하여 Partitioning작업을 하면 효과를 볼 수 있다.  
 +
# Global Index는 Base Table의 Partition Key와는 무관하게 Partitioning을 하는 것이고
 +
# 설사 Base Table의 Partition Key로 Global Index를 Partitioning 했다 하더라도 Local Index처럼 Equipartitioning이 된 개념이 아니므로 Table DDL시 전체의 Index를 Rebuild해야 한다.
 +
 
 +
[[파일:IMG 8386.jpg]]
 +
* 그림 설명
 +
# Global Prefixed Partitioned Index 임.  
 +
#“Prefixed”란 Index의 Partition Key (DEPTNO)가 Index 첫 번째 컬럼(DEPTNO)된다는 것.
 +
# Global Index의 경우 모든 Indexed Value가 Sorting이 되어 있는데 이는 각각의 Index Partition의 Root Block에 들어가는 Value값들이 Index Partition에 따라 정렬됨을 의미.
 +
# 그러면 자연적으로 Leaf Bock에 들어가는 모든 Value들은 정렬이 되기 때문이다. Global Non-Prefixed Partitioned Index는 개념상 Index Partition Key로 각 Index Partition의 Root Block을 만들지 않는 것이기 때문에 전체 데이터에 대해 Sorting을 보장 받을 없다. 따라서 현재 지원되지 않는다.
 +
# Global Index를 Partitioning할 때는 Local Index와는 다르게 Range Partitioning밖에 지원 되지 않는다. 그 이유는 바로 ‘정렬’ 때문인 것이다. 
 +
# Range Partition은 Partitioning Key자체를 Sorting에 의해 생성하기 때문이고 다른 Partitioning은 정렬과 상관이 없는 Partitioning 방법이기 때문이다.
 +
 
 +
====== Global Prefixed Index ======
 +
# Base Table과 비교하여 not equi-partitioned 상태
 +
# Oracle은 only Index structure만 관리합니다. (Partition은 관리안함)
 +
# 최종 Partition에는 Maxvalue값이 반드시 기술되어야 함.
 +
# Local index보다 관리하기 힘듭니다.
 +
# 기준 Table의 Partition이 변경되면 global index의 모든 Partition에 영향을 미칩니다.
 +
#:- (Global Index 재생성 해야함,19c부터는 update 옵션 사용으로 Index Unusable 되는 문제 개선됨.)
 +
<source lang=sql>
 +
-- 테이블 생성
 +
CREATE TABLE SALES_DATA_2008
 +
(
 +
COLUMN_1 NUMBER NOT NULL,
 +
COLUMN_2 VARCHAR2(4),
 +
COLUMN_3 VARCHAR2(4),
 +
COLUMN_4 VARCHAR2(2),
 +
COLUMN_5 VARCHAR2(2),
 +
COLUMN_6 NUMBER
 +
)
 +
PARTITION BY RANGE ( COLUMN_3, COLUMN_4 )
 +
(
 +
PARTITION P_200801 VALUES LESS THAN ('04', '01'),
 +
PARTITION P_200802 VALUES LESS THAN ('07', '01'),
 +
PARTITION P_200803 VALUES LESS THAN ('10', '01'),
 +
PARTITION P_200804 VALUES LESS THAN ('12', MAXVALUE)
 +
);
 +
 
 +
-- Global Prefixed Index
 +
CREATE UNIQUE INDEX RANGE2_GPX8 ON SALES_DATA_2008(COLUMN_2, COLUMN_1)
 +
TABLESPACE TABLE_SPACE_DATA_1
 +
PCTFREE 10
 +
STORAGE( INITIAL 100K NEXT 100K PCTINCREASE 0 )
 +
GLOBAL PARTITION BY RANGE ( CODE )
 +
(
 +
PARTITION P_2008_P1 VALUES LESS THAN ('2000'),
 +
PARTITION P_2008_P2 VALUES LESS THAN ('3000'),
 +
PARTITION P_2008_P3 VALUES LESS THAN (MAXVALUE)
 +
);
 +
 
 +
</source>
  
* local 인덱스 생성시 PK값에 partition key을 넣어야 합니다.global 은 상관없음..
+
====== Non-Partitioned Index ======
[[category:oracle]]
+
# 파티션과는 아무런 상관없는 Normal Index를 말함.

2024년 3월 26일 (화) 01:04 판

thumb_up 추천메뉴 바로가기


1 파티션 인덱스 (Partitioned Index)[편집]

  1. Partitioned Index는 Partitioned Table에서만 쓰이는것으로 잘못된 생각임.
  2. Partitioned Index는 Partitioned Table과 별개의 것이며 단지 많은 상호 연관을 가지고 있을 뿐이다.
  3. Partitioned Index는 말 그대로 Index가 Partitioning 된 것으로 Base Table이 Partitioned Table이든 Non-Partitioned Table이든 상관없이 Partitioned Index를 만들 수 있다.
  • 일반테이블로 파티션 인덱스 만드는 예시)

EMP테이블의 Size가 상당히 크고 Non-Partitioned Table(그냥 일반 Table)일 경우 Index를 Partitioned Index로 만들고자 한다면 다음과 같이 할 수 있다

CREATE INDEX EMP_IDX1 
    ON EMP (DEPTNO) GLOBAL PARTITION BY RANGE (DEPTNO)
(PARTITION PAR_10 VALUES LESS THAN ('20') TABLESPACE TBS1,
PARTITION PAR_20 VALUES LESS THAN ('30') TABLESPACE TBS2,
PARTITION PAR_30 VALUES LESS THAN ('40') TABLESPACE TBS3,
PARTITION PAR_40 VALUES LESS THAN ('50') TABLESPACE TBS4,
PARTITION PAR MAX VALUES LESS THAN (MAXVALUE) TABLESPACE TBS5)
  • 위 인덱스는 'Global Prefixed Partitioned Index’라 부른다.

2 Partitioned Index 와 Non-Partitioned Index[편집]

2.1 차이점[편집]
  1. Partitioned Table과 Non-Partitioned Table의 차이점과 동일.
  2. Index의 경우 Indexed Column과 Rowid 순으로 Value가 Sorting이 되어 있는데, 이런 특성은 Partitioning과는 무관하다.
  3. Partitioned Index는 전체 Table에 대하여 Value의 Sorting이 보장되지 않는다라고 생각하고 있지만 이것은 사실과 다르며,
  4. Global Partitioned Index의 경우는 Value가 전체 Table에 대하여 Sorting이 보장 되어 있으며 Index에 대한 관리도 Partition별로 독립적으로 할 수 있다.(이것은 Base Table의 Partitioning과는 무관한 것이다.)
2.2 Non-Partitioned Index와 Partitioned Index의 구조[편집]

IMG 8385.jpg

  • 그림설명
  1. 위의 그림에서 Non-Partitioned Index는 하나의 Root Node에서 Leaf Node까지 전체적인 Balance를 유지하는 구조
  2. Partitioned Index는 Partition별로 독립적인 Root Node와 Leaf Node를 가지고 각각의 Balance를 유지하는 구조
  3. 따라서 대용량의 Table에서 Global Index의 Depth는 굉장히 깊어질 수 있다.
  4. Partitioned Index는 각각의 Partition별 Depth가 Non-Partitioned Index보다 얕아지고 Index의 관리도 Partition별로 할 수 있어 Parallel Processing에 의한 Index Management에 매우 효과적이다.
  5. Partitioned Index의 경우 Index Partition Key가 해당 검색 조건에 들어올 때만이 해당 Index Partition을 Search하여 효과를 볼 수 있고 만약, Partitioned Index에 Index Partition Key가 해당 검색 조건에 들어오지 않으면 전체의 Partition에 대해서 Index를 Lookup할 수 밖에 없다.
  6. 따라서 Local Index의 경우는 Index Partition Key와 Base Table의 Partition Key가 동일하므로 검색 조건에 이 Index Partition Key가 들어오지 않으면 전체의 Partition에 대해서 반복적인 Lookup작업이 일어나게 되어 Performance 저하를 일으킬 수 있다.
  7. Global Partitioned Index의 경우는 Index의 첫 번째 컬럼(leading Column)이 Index Partition Key가 되는 Prefixed Index 즉, Global Prefixed Partitioned Index로만 생성이 되기 때문에 (그 이유는 밑에서 설명) 조회 검색 조건에 이 Index를 사용하려면 첫 번째 컬럼인 Index Partition Key가 들어오지 않을 수 없다.
  8. 따라서 해당 Index Partition을 지정해서 Index Search를 할 수 있는 것이다.
  9. 이것은 대용량 데이터 환경에서 Non-Partitioned Global Index의 Index Depth가 깊어진다는 점에서 Global Partitioned Index가 성능 면에서 우수할 수 있고
  10. 또한, 인덱스 Rebuild시에도 각각의 Partition별로 Parallel Processing을 할 수 있는 장점을 가지는 것이다.


assignment 파티션 인덱스 종류
  • 로컬 인덱스(Local index)  : table partition과 동일한 index partition을 사용.
    • Prefixed  : index column의 left column을 사용하여 index partition을 구성.
    • Non-Prefixed  : index column의 left column 이외의 column을 사용하여 index partition을 구성.
  • 글로벌 인덱스(Global index)  : 하나의 index partition에서 둘 이상의 table partition을 지정.


3 글로벌 인덱스 와 로컬 인덱스[편집]

  1. 'Partition이 되었는가? 아니면 Partition이 되어있지 않은가?’차이로 구분하는것은 잘못된 생각
  2. 일반 테이블의 Index도 Partitioning을 할 수 있으며 Partition별로 관리를 할 수 있다.
  3. Global Index와 Local Index의 가장 근본적인 차이점은 정렬의 차이이다.
  4. 즉, Global Index는 테이블 전체에 대하여 Indexed Column과 Rowid 순으로 Sorting이 보장된 (Optimizer가 보장하는) Index이고,
  5. Local Index는 테이블 전체에 대하여 Indexed Column과 Rowid 순으로 Sorting이 보장되지 않는 대신, 각각의 해당 Partition 내에서만 Sorting이 보장된 Index이다.
  6. 이것이 Global Index와 Local Index의 가장 큰 차이점이다.
3.1 로컬 인덱스 (Local Index)[편집]
  1. Local Index는 지역적인 Index로 Default가 Base Table의 Partition Key로 Partitioning된 Index이다.
  2. 인덱스를 생성한 인덱스와 파티션된 인덱스가 동일하게 파티션된 형태.
  3. Index의 구성 컬럼에 Base Table의 Partition Key가 포함이 되는가의 여부에 상관없이 Local Index의 Partition Key는 Base Table의 Partition Key가 되는 Equipartitioning된 Index인 것이다.
  4. 인덱스와 테이블은 같은 칼럼에 의해 파티션되며, 하나의 인덱스 파티션이 테이블 파티션 하나와 대응되며, 대응되는 인덱스 파티션과 테이블 파티션은 각각 같은 범위를 갖게 됨.
  5. 결국 특정한 하나의 인덱스에 포함된 모든 Key들은 하나의 테이블 파티션 내의 데이타만 가리킴.
  6. Local Index에 반드시 Partition Key가 포함 되어야만 검색조건에 Partition Key가 들어왔을 때 지정된 Partition을 사용하는게 아니라 ,
  7. Local Index에 Partition Key가 포함이 되지 않아도 검색조건에 Partition Key가 들어오면 해당 Partition을 지정하게 된다.
3.1.1 Local Prefixed Index[편집]
  1. 인덱스의 맨 앞에 있는 컬럼에 의해 파티션되는 방식
  2. Local Prefixed Index에서 칼럼은 Unique/Non-Unique를 모두 허용
  3. Base Table 의 파티션이 변경되면 Local Index의 관련 파티션만 변경 됨.
CREATE TABLE DEPT
(
	DEPT 	NUMBER 		NOT NULL,
	DNAME 	VARCHAR2(10) 	NOT NULL,
	LOC	VARCHAR2(14)
)
PARTITION BY RANGE (DEPTNO)
(
	PARTITION PART_1 VALUES LESS THAN (30),
	PARTITION PART_2 VALUES LESS THAN (MAXVALUE)
);

CREATE INDEX DEPT_N1 ON DEPT(DEPTNO) LOCAL;
3.1.2 Local Non-Prefixed Index[편집]
  1. Index의 첫번째 Column이 Partition Key가 아닌 형태로 Base Table과 동일한 Partition 구조를 가진 Index(equi-partitioned)
  2. 빠른 Access가 요구될 때 유용(Base Table의 Partition Key는 제외)
  3. Partition 단위로 관리할 수 있으므로 Global Index에 비해 운영상 편리합니다.
  4. OLAP 측면에서 Global Index보다 조회 속도가 저하.
CREATE TABLE DEPT
(
	DEPTNO 	NUMBER 		NOT NULL,
	DNAME	VARCHAR2(10)	NOT NULL,
	LOC 	VARCHAR2(14)
)
PARTITION BY RANGE (DEPTNO)
(
	PARTITION PART_1 VALUES LESS THAN (30),
	PARTITION PART_2 VALUES LESS THAN (MAXVALUE)
);

CREATE INDEX DEPT_N2 ON DEPT(LOC) LOCAL;
3.2 글로벌 인덱스 (Global Index)[편집]
  1. Global Index는 테이블과 다르게 파티션되는 경우
  2. Global Index는 전역적인 Index로 Default가 Non-Partitioned Index이다.
  3. Global Index를 Partitioning해서 사용을 할 생각이 없는 듯 하다.
  4. 대용량의 테이블에서 Index 관리의 효율성을 높이고 Index Search의 Performance를 향상시키기 위하여 Partitioning작업을 하면 효과를 볼 수 있다.
  5. Global Index는 Base Table의 Partition Key와는 무관하게 Partitioning을 하는 것이고
  6. 설사 Base Table의 Partition Key로 Global Index를 Partitioning 했다 하더라도 Local Index처럼 Equipartitioning이 된 개념이 아니므로 Table DDL시 전체의 Index를 Rebuild해야 한다.

IMG 8386.jpg

  • 그림 설명
  1. Global Prefixed Partitioned Index 임.
  2. “Prefixed”란 Index의 Partition Key (DEPTNO)가 Index 첫 번째 컬럼(DEPTNO)이 된다는 것.
  3. Global Index의 경우 모든 Indexed Value가 Sorting이 되어 있는데 이는 각각의 Index Partition의 Root Block에 들어가는 Value값들이 Index Partition에 따라 정렬됨을 의미.
  4. 그러면 자연적으로 Leaf Bock에 들어가는 모든 Value들은 정렬이 되기 때문이다. Global Non-Prefixed Partitioned Index는 개념상 Index Partition Key로 각 Index Partition의 Root Block을 만들지 않는 것이기 때문에 전체 데이터에 대해 Sorting을 보장 받을 수 없다. 따라서 현재 지원되지 않는다.
  5. Global Index를 Partitioning할 때는 Local Index와는 다르게 Range Partitioning밖에 지원 되지 않는다. 그 이유는 바로 ‘정렬’ 때문인 것이다.
  6. Range Partition은 Partitioning Key자체를 Sorting에 의해 생성하기 때문이고 다른 Partitioning은 정렬과 상관이 없는 Partitioning 방법이기 때문이다.
3.2.1 Global Prefixed Index[편집]
  1. Base Table과 비교하여 not equi-partitioned 상태
  2. Oracle은 only Index structure만 관리합니다. (Partition은 관리안함)
  3. 최종 Partition에는 Maxvalue값이 반드시 기술되어야 함.
  4. Local index보다 관리하기 힘듭니다.
  5. 기준 Table의 Partition이 변경되면 global index의 모든 Partition에 영향을 미칩니다.
    - (Global Index 재생성 해야함,19c부터는 update 옵션 사용으로 Index Unusable 되는 문제 개선됨.)
-- 테이블 생성
CREATE TABLE SALES_DATA_2008
(
	COLUMN_1 NUMBER		NOT NULL,
	COLUMN_2 VARCHAR2(4),
	COLUMN_3 VARCHAR2(4),
	COLUMN_4 VARCHAR2(2),
	COLUMN_5 VARCHAR2(2),
	COLUMN_6 NUMBER
)
PARTITION BY RANGE ( COLUMN_3, COLUMN_4 )
(
	PARTITION P_200801 VALUES LESS THAN ('04', '01'),
	PARTITION P_200802 VALUES LESS THAN ('07', '01'),
	PARTITION P_200803 VALUES LESS THAN ('10', '01'),
	PARTITION P_200804 VALUES LESS THAN ('12', MAXVALUE)
);

-- Global Prefixed Index
CREATE UNIQUE INDEX RANGE2_GPX8 ON SALES_DATA_2008(COLUMN_2, COLUMN_1)
TABLESPACE TABLE_SPACE_DATA_1
PCTFREE		10
STORAGE( INITIAL 100K NEXT 100K PCTINCREASE 0 )
GLOBAL PARTITION BY RANGE ( CODE )
(
	PARTITION P_2008_P1 VALUES LESS THAN ('2000'),
	PARTITION P_2008_P2 VALUES LESS THAN ('3000'),
	PARTITION P_2008_P3 VALUES LESS THAN (MAXVALUE)
);
3.2.2 Non-Partitioned Index[편집]
  1. 파티션과는 아무런 상관없는 Normal Index를 말함.