Oasis' story

인덱스 (INDEX) 본문

Program Note/DB

인덱스 (INDEX)

oasispapa 2014. 10. 13. 13:28

* 인덱스 컬럼 설정시 기본적으로 고려해야할 점.

- 해당 컬럼이 광범위한 값이 포함되는가 (데이터 구분을 위한 스펙트럼이 넓은 값의 범위를 갖나 ex.PK)

- 2~4% 미만의 행을 검색하는가 (테이블의 다량 데이터를 검색할 경우, full scan이 I/O를 적게 일으키고 한번에 로딩하는 버퍼가 크므로, 일반적으로 더 빠름)

- where 절에 자주 사용되는가

- 널 값이 많이 포함된 경우

cf) 인덱스를 생성하지 않아야 하는 경우

- 테이블이 작은 경우

- 컬럼이 쿼리에 자주 사용되지 않는 경우

- 대부분의 쿼리가 테이블에 있는 행의 4% 이상을 검색할 경우

- 테이블이 자주 갱신되는 경우(DML 작업이 발생할 때마다, 오라클이 자동으로 인덱스를 갱신하므로 느려짐)

 

* Primary Key , Unique 제약 조건을 정의할 경우 자동으로 인덱스가 생성되며 유저가 임의로 drop 할 수 없음.

 

* 인덱스 컬럼과 RowID를 같이 저장하므로 데이터 검색이 빠른 원리다.

 

* 인덱스 사용시 주의해야 할 점

1. 암시적(implicit)인 데이터 타입 변환이 발생하지 않도록 한다.

ex) number type의 컬럼 A를 where 절에 A = '1' 이런식으로 표현하면 안됨. A=1 (O).

2. 조건절에서 인덱스 컬럼을 변형하지 않는다.

ex) 수식과 함께 사용한다거나 함수의 파라미터로 사용하면 인덱스 사용 안하게 됨.

     where salary*2 > 2000 . 

     where substr(last_name, 1,1) = 'N' -> last_name like 'N%' (O) or 함수기반 인덱스 생성

 

* 딕셔너리에서 인덱스 조회

select ic.idex_name, ic.column_name, ic.column_position "컬럼순서"

   from user_indexes i , user_ind_column ic

where ic.index_name = i.index_name

   and ic.table_name ='emp'

ordery by ic.column_name;