오라클 Index 기초
안녕하세요. 갓대희 입니다. 이번 포스팅은 [ Oracle Index 기본 개념, 기본 활용 방법 ] 입니다. :)
INDEX
인덱스는 인덱스 칼럼에 속해 있는 레코두에 대한 디스크의 물리적인 저장 위치를 나타내는 ROWID와 해당 칼럼 값의 집합으로 이루어 져있다.
그러므로 Oracle은 인덱스의 ROWID의 주소를 가지고 원하는 테이블의 데이터를 접근할 수 있다.
( ※ROWID = ROW(행)의 ID(Identity) 즉 행과 행을 구분하는 식별자, 디스크에 저장된 행의 물리적 위치를 나타내는 정보 )
Oracle에서 지원하는 인덱스의 보편적인 형태는 B*Tree 구조에서의 데이터 접근 방법이다. 오라클에서 인덱스 생성 시 기본으로 설정되어 있다.
Oracle Optimizer
사용자가 실행하는 SQL에 대하여 가장 적절한 데이터 추출 경로가 무엇인가를 결정하는 Oracle 내부 아키텍처.
Oracle Optimizer는 크게 규칙기반(Rule-base)과 비용기반(Cost-based)으로 나누어 지는데
규칙기반(Rule-based)은 Oracle 데이터베이스 시스템이 미리 정해놓은 일정한 순위대로 실행.
비용기반(Cost-based)은 분석된 데이터베이스 현재 상태를 기반으로 비용이 가장 적게 드는 실행 경로(Execution plan)를 채택하여 실행.
일반적으로 비용기반 (Cost-based) 접근이 규칙기반(Rule-based) 접근보다 나은 실행 계획을 제공하는데 비용기반접근을 통해 Oracle Optimizer가 실행 계획을 얻기 위하서는 통계 정보가 필요하다.
(※DBMS_STAT 패키지는 데이터베이스 분석을 전문으로 하는 프로시저들의 집합. Oracle 8i부터 포함.)
인덱스 생성시 Oracle 내부적으로 다음와 같이 진행한다.
1. 인덱스를 지정한 컬럼 id의 값을 모두 잃는다 (Full Table Scan 발생)
2. 지정컬럼 id 값에 대해 오름차순 정렬.
3. ROWID와 지정컬럼 id 값을 저장하기 위해 저장 공간(EXTENT 단위)을 할당한다.
4. 할당 후 값을 저장. 만약 인덱스 생성할 때 테이블스페이스를 지정하지 않으면 현재 접속 중인 사용자의 기본 테이블스페이스에 인덱스를 생성
인덱스 사용시 고려할 점.
인덱스가 항상 나은 성능을 보장하지 않는다. 조건을 만족하는 대상이 되는 데이터가 전체 데이터에서 차지하는 비율에 따라 Optimizer는 실행 계획을 다르게 설정한다.
또한, 조건절에 사용하는 컬럼 순서에 따라 인덱스의 사용이 달라질 수 있다.
인덱스를 설정 해야하는 컬럼
1. where절이나 join 조건으로 자주 사용되는 컬럼
2. 모든 값이 컬럼 내에서 UNIQUE한 경우
3. 넓은 범위의 값을 가진 컬럼
4. 아주 드물게 존재하는 컬럼
5. 테이블에 관리되는 데이터 양이 많고, 질의할 때 전체 행의 10~15%미만이 검색의 대상이 되는 경우 ( Percentage는 Oracle Version에 따라 상이 하다)