인덱스는 Pointer 를 이용하여 좀 더 빠르게 데이터를 검색하도록 하는 Object 이다.
특정 컬럼에 인덱스가 생성되어 있지 않으면 일반적으로 데이터를 찾기 위해
Full Scan 을 한다.
인덱스가 일단 생성되면, 사용 및 유지보수는 Oracle Server 에서 자동관리 되고,
인덱스는 테이블과 독립적이므로, 삭제해도 데이터에 영향을 미치지 않는다.
- 인덱스 생성방법에 따른 종류
1. Unique Index : Primary key, Unique 제약조건에 의해 자동생성
2. NON-Unique Index : 사용자에 의해 생성
- 인덱스 연결 컬럼의 수에 따라
1. 단일 인덱스
2. 결합 인덱스 : 여러 개의 컬럼을 결합하여 인덱스 생성
인덱스는 B* Tree 구조를 이용한다.
컬럼의 값(데이터 값)으로 트리 노드를 검색하여 찾아내면 ROWID로 데이터에 접근.
- 인덱스 생성시 고려할 사항
1. 조건절 (where) 이나 조 (join) 조건에서 컬럼을 자주 이용할 때
2. 컬럼이 넓은 범위의 값을 가질 때
3. 많은 NULL 값을 갖는 컬럼일때 (B* Tree에 add 되지 않아 검색효율 상승)
4. 테이블 데이터가 많고 그 테이블에서 조회되는 행의 수가 전체의 2~4% 이상 일때
인덱스란 빠른 검색을 위해서 사용하는 독립된 객체이다.
인덱스란 18자리의 ROWID(16진수값)와 열 값으로 구성되어 있다.
생성구문)
CREATE [UNIQUE] INDEX [schema] 인덱스명 ON [schema,] 테이블명 (컬럼 [ASC | DESC] [,컬럼 [ASC | DESC]]...) [TABLESPACE 테이블 스페이스 명] [PCTFREE 값] [INITRANS 숫자] [MAXTRANS 숫자] [storage 절] [LOGGING | NOLOGGING] [NOSORT] [REVERSE]; |
밸런스 트리 인덱스를 만드는 기준은 다음과 같다.
* 인덱스를 만들어야 하는 열은 DML(insert, update, delete) 문의 WHERE 절에 자주 나오는 열이다.
* 조인되는 테이블의 조인 열에는 인덱스를 만들어야 한다.
* 인덱스에 NULL 값이 저장되지 않기 때문에, NULL 값이 많은 열에 인덱스를 만들면 유리하다.
* DML 문장의 WHERE 절에 의해 검색되는 데이터의 테이블 전체의 10~15% 의 범위에 속할 때
인덱스를 만들어야 한다.
* 하나의 테이블에 인덱스를 많이 만들면 update, delete 할 때 실행속도가 늦어진다.
삭제구문)
DROP INDEX <인덱스명>; |
index 는 생성 이후, Oracle Server 가 자동으로 유지보수 하기 때문에 수정할 수 없다.
따라서 index를 수정하는 대신 이전의 index를 삭제하고 새로 만들어야 한다.
오라클에서 인덱스 보기
select * from USER_IND_COLUMNS where table_name = upper('테이블명') order by index_name; |
* B* Treef
오라클 인덱스는 B-tree (binary search tree)를 기반으로 하며, 인덱스의 물리적 구조가
좌우대칭 구조를 이루고 있어 Balance-tree 라 한다.
B-Tree 인덱스는 컬럼 안에 독특한 데이터가 많을 때 효과적이다.
B-tree 인덱스는 먼저 주어진 값을 리스트의 중간점에 있는 값과 비교하여 그 값이 크면
리스트의 절반을 버리고, 그 값이 작으면 큰 쪽 리스트의 절반을 버린다.
하나의 값이 발견될 때까지 또는 리스트가 끝날 때까지 그와 같은 작업을 다른 반쪽에도
반복하여 검색이 이루어 진다.
'개발 > 오라클' 카테고리의 다른 글
[ oracle 10g ] START WITH ... CONNECT BY 절을 사용한 계층형쿼리 (0) | 2010.10.22 |
---|---|
오라클 각종 정보 알아보기 (0) | 2010.09.13 |