2009. 4. 15. 14:55

[Oracle] 오라클 객체(1) [인덱스(Index)]

인덱스는 테이블이나 클러스트에서 쓰여지는 선택적인 객체로서, 오라클 데이터베이스 테이블내의 원하는 레코드를 빠르게 찾아갈 수 있도록 만들어진 데이터 구조 입니다.

 

자동 인덱스 : 프라이머리 키 또는 unique 제한 규칙에 의해 자동적으로 생성되는 인덱스 입니다.

 

수동 인덱스 : CREATE INDEX 명령을 실행해서 만드는 인덱스들 입니다.

 

※ Index를 생성하는 것이 좋은 Column

- WHERE절이나 join조건 안에서 자주 사용되는 컬럼

- null값이 많이 포함되어 있는 컬럼

- WHERE절이나 join조건에서 자주 사용되는 두 개이상의 컬럼들

 

※ 다음과 같은 경우에는 index 생성이 불필요 합니다.

- table이 작을 때

- 테이블이 자주 갱신될 때

 

※ 오라클 인덱스는 B-tree(binary search tree)에 대한 원리를 기반으로 하고 있습니다.

 

B-tree인덱스는 컬럼안에 독특한 데이터가 많을 때 가장 좋은 효과를 냅니다.

 

이 알고리즘 원리는

 

- 주어진 값을 리스트이 중간점에 있는 값과 비교합니다.

  만약 그 값이 더 크면 리스트의 아래쪽 반을 버립니다.

  만약 그 값이 더 작다면 위쪽 반을 버립ㄴ디ㅏ.

 

- 하나의 값이 발견될 때 까지 또는 리스트가 끝날 때까지 그와 같은 작업을 다른 반쪽에도 반복합니다.

 

                                                                                                                                  

※ 인덱스는 B-tree 구조를 가지며 크게 다음 네 가지로 분류될 수 있습니다.

 

1) Bitmap 인덱스

 

- 비트맵 인덱스는 각 컬럼에 대해 적은 개수의 독특한 값이 있을 경우에 가장 잘 작동합니다. 그러므로 비트맵 인덱스는 B-tree 인덱스가 사용되지 않을 경우에서 성능을 향상 시킵니다. 테이블이 매우 크거나 수정/변경이 잘 일어나지 않는 경우에 사용할수 있습니다.

 

SQL> CREATE BITMAP INDEX emp_deptno_indx

          ON emp(deptno);

 

 

2) Unique 인덱스

 

- Unique 인덱스는 인덱스를 사용한 컬럼의 중복값들을 포함하지 않고 사용할 수 있는 장점이 있습니다. 프라이머리키와 Unique 제약 조건시 생성되는 인덱스는 Unique 인덱스 입니다.

 

SQL> CREATE UNIQUE INDEX emp_ename_indx

          ON emp(ename);

 

3) Non-Unique 인덱스

 

- Non-Unique 인덱스는 인덱스를 사용한 컬럼에 중복 데이터 값을 가질수 있습니다.

 

SQL> CREATE INDEX dept_dname_indx

          ON dept(dname);

 

4) 결합(Concatenated(=Composite)) 인덱스

 

- 복수개의 컬럼에 생성할 수 있으며 복수키 인덱스가 가질수 있는 최대 컬럼값은 16개 입니다.

 

SQL> CREATE UNIQUE INDEX emp_empno_ename_indx

          ON emp(empno, ename);

 

                                                                                                                                  

** 인덱스의 삭제 **

 

- 인덱스의 구조는 테이블과 독립적이므로 인덱스의 삭제는 테이블의 데이터에는 아무런 영향도 미치지 않습니다.

 

- 인덱스를 삭제하려면 INDEX의 소유자이거나 DROP ANY INDEX권한을 가지고 있어야 합니다.

 

- INDEX는 ALTER를 할 수 없습니다.

 

SQL> DROP INDEX emp_empno_ename_indx;

 

                                                                                                                                  

※ 인덱스에 대한 정보는 USER_INDEXS 뷰 또는 USER_IND_COLUMNS 뷰를 통해 검색할 수 있습니다.

 

SQL> SELECT index_name, index_type

          FROM USER_INDEXS

          WHERE table_name = 'EMP';

 

INDEX_NAME                        INDEX_TYPE
---------------------------     -----------
EMP_DEPTNO_INDX                BITMAP
EMP_PK_EMPNO                    NORMAL

 

                                                                                                                                  

 


  ================================================
    * Oracle Community OracleClub.com
    * http://www.oracleclub.com
    * http://www.oramaster.net
    * 운영자 : 김정식 (oramaster _at_ empal.com)
  ================================================
※ 강좌를 다른 홈페이지에 기재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^