ORACLE DB
[ORACLE] INDEX(인덱스, 색인)
호떡은뜨거워
2024. 3. 7. 00:13
인덱스 생성해서 사용하는 이유
- where 절이 있는 select 명령문의 속도를 높이기 위함
인덱스 생성 원칙
1. where 절에서 자주 사용되어진 컬럼에 만들어야 한다.
2. 선택도(selectivity)가 높은 컬럼에 만들어야 한다.
- 고유한 데이터일수록 선택도가 높다.
- 선택도가 낮다 => 성별은 선택의 여지가 아주 낮기 때문에 선택도가 낮은 편이다.
- 선택도가 높다 => 학번은 고유하고 골라야할 대상이 매우 많으므로 선택도가 높은 것이다.
3. 카디널리티(cardinality)가 높은 컬럼에 만들어야 한다.
- 카디널리티는 집합원의 개수이다.
- 카디널리티가 높다 : '상대적으로' 중복도가 낮아서 고유한 데이터이다.
- 카디널리티가 낮다 : '상대적으로' 중복도가 높아 중복된 데이터가 많다.
- 예) 주민번호는 성명에 비해 '상대적으로' 카디널리티가 높다.
UNIQUE 한 INDEX 생성하기
- 어떤 컬럼에 unique 한 인덱스를 생성하면, 그 컬럼에는 중복되지 않는 고유한 값만 들어올 수 있다.
- non-unique 한 인덱스보다 검색 속도가 조금 더 빠르다.
[ 문법 ]
create unique index 인덱스명
on 해당테이블명 (컬럼명 asc | desc);
1. 인덱스 생성
create unique index idx_tbl_student_1_hakbun
on tbl_student_1(hakbun);
2. 행 삽입 : insert ~ value ~
- 행이 삽입될 때 hakbun 컬럼에 중복된 값이 있으면 오류가 난다.
3. commit;
4. 테이블에 생성되어진 index 조회하기
(여기서는 tbl_student_1 테이블에 생성되어진 index 를 조회하겠다.)
select *
from user_indexes
where table_name = 'TBL_STUDENT_1';
select *
from user_ind_columns
where table_name = 'TBL_STUDENT_1';
위 두개를 JOIN 시켜준다.
↓ ↓ ↓
select A.index_name, A.uniqueness, B.column_name, B.descend -- 이건 임의로 선택한 것임
from user_indexes A JOIN user_ind_columns B
on A.index_name = B.index_name
where A.table_name = 'TBL_STUDENT_1';
NON - UNIQUE 한 INDEX 생성하기
- 어떤 컬럼에 non-unique 한 인덱스를 생성하면 그 컬럼에는 중복된 값이 들어올 수 있다.
- unique 한 인덱스보다 검색 속도가 다소 느린 편이다.
[ 문법 ]
create index 인덱스명
on 해당테이블명 (컬럼명 asc | desc);
1. 인덱스 생성
create index idx_tbl_student_1_name
on tbl_student_1(name);
- 동명이인이 있기 때문에 name 컬럼에 중복값이 허용되어야 한다.
2. 행 삽입 : insert ~ value ~
- 행이 삽입될 때 name 컬럼에 중복된 값이 있어도 허용된다.
3. commit;
4. 테이블에 생성되어진 index 조회하기
select A.index_name, A.uniqueness, B.column_name, B.descend
from user_indexes A JOIN user_ind_columns B
on A.index_name = B.index_name
where A.table_name = 'TBL_STUDENT_1';
※ 만들어진 인덱스의 형태는 아래와 같다.
-------------------------------------------------------------------------------------------------------------------------
INDEX_NAME UNIQUENESS COLUMN_NAME DESCEND
-------------------------------------------------------------------------------------------------------------------------
IDX_TBL_STUDENT_1_HAKBUN UNIQUE HAKBUN ASC
IDX_TBL_STUDENT_1_NAME NONUNIQUE NAME ASC
-------------------------------------------------------------------------------------------------------------------------
인덱스 활용
select *
from tbl_student_1
where hakbun = '2';
select *
from tbl_student_1
where name = '이미자';
- unique 한 hakbun 컬럼 / non-unique 한 name 컬럼은 각각 생성되어진 인덱스인
- IDX_TBL_STUDENT_1_HAKBUN, IDX_TBL_STUDENT_1_NAME 인덱스를 사용하여 빠르게 조회해온다.
- 그러나, address 컬럼의 경우에는 인덱스가 없으므로 tbl_student_1 테이블에 있는 모든 데이터를 조회해서 address 컬럼의 값이 일치하는 데이터를 가져온다.
- Table Full-scan : 인덱스를 사용하지 않고 데이터 조회(테이블 전체 조회) => 속도가 가장 느리다.