티스토리 뷰
정의
조회 속도를 향상시키기 위한 데이터베이스 검색 기술. 해당 테이블의 조회결과를 빠르게 하기 위해 사용. ('색인' 이라 칭함)
인덱스를 생성해 줌으로 써 조회 속도를 빠르게 할 수 있기 때문에 인덱스가 필요.
종류
자동인덱스 : Primary Key 또는 Unique 제한 규칙에 의해 자동으로 생성되는 인덱스
수동인덱스 : CREATE INDEX 명령을 실행해서 만들어지는 인덱스
원리
기본
1. 인덱스 설정 시 INDEX TABLE 이 생성
2. 인덱스 컬럼의 로우값과 ROWID 값이 저장
3. 로우값을 트리 구조로 저장
1~3 과정이 발생하기 때문에 검색 시 좀더 빠른 데이터 조회가 가능.
* ROWID : 데이터 삽입 시 하나의 ROW 가 생성되며 이 ROW 는 절대적인 주소를 가지게 되는데 이를 ROWID 라고 한다.
- 인덱스 선두 컬럼이 조건절에서 사용되지 않으면 범위 스캔을 위한 시작점을 찾을 수 없어 옵티마이저는 인덱스 전체를 스캔하거나 테이블 전체를 스캔하는 방식을 선택한다.
- 결합 인덱스일 때는 인덱스 구성 컬럼중 하나라도 값이 null이 아닌 레코드는 인덱스에 포함되므로, 필터링을 통해 '인덱스 구성 컬럼중 하나 is not null' 조건에 해당하는 레코드를 찾을 수 있다.
- 옵티마이저는 where pk컬럼 is null 조건은 인덱스 스캔을 통해 공집합을 리턴하는 방식으로 table full scan을 피한다
- 결합 인덱스일 때는 인덱스 구성 컬럼중 하나라도 값이 is null 조건을 사용하더라도 인덱스 선두컬럼이 조건절에서 누락되지 않으면 Index Range Scan이 가능하다.
- 결합 인덱스일 때는 인덱스 구성 컬럼중 어느 하나에 Not Null 제약이 설정돼 있다면 그 컬럼에대한 조건식 유무에 상관없이 항상 Index Range Scan이 가능하다.
- 숫자형 컬럼과 문자형 컬럼을 비교하면 문자형 컬럼이 숫자형으로 변환
- like로 비교할 때는 숫자형이 문자형으로 변환
- decode(a, b, c, d)는 출력된 값의 데이터 타입은 세번째 인자 c에 의해 결정된다. c인가자 null값이면 varchar2로 취급한다
- 문자형과 날짜형이 만나면 날짜형으로 변환
- 성능을 위해서라면 인덱스 컬럼과 비교되는 반대쪽을 인덱스 컬럼 데이터 타입에 맞춘다.
단점
UPDATE, INSERT, DELETE 등 DML 명령 사용 시 INDEX TABLE 까지 데이터 갱신이 이루어지기 때문에 속도가 느려짐.
인덱스가 필요한 경우
- 데이터가 많이 쌓일 거라고 예상되는 경우
- 데이터가 많이 쌓여 있어 조회 속도가 너무 느릴 경우
- 조회 결과가 전체 데이터수의 3~5% 미만일 경우 인덱스 스캔이 효율적이며 적은 COST 로 빠르게 데이터 검색 가능
- 조회 결과가 전체 데이터수의 3~5% 이상일 경우 풀스캔이 유리
인덱스가 필요없는 경우
- 데이터가 적은 경우
- 조회보다 삽입, 수정, 삭제 처리가 많은 테이블
- 조회결과가 전체행의 15% 이상 읽어들일 것으로 예상 될 때.
생성방법
- 단일 인덱스
CREATE INDEX [인덱스명] ON TABLE_NAME [컬럼명]
- 다중(복합) 인덱스
CREATE INDEX [인덱스명] ON TABLE_NAME [컬럼명1, 컬럼명2, 컬럼명3]
* 복합인덱스를 타게 하려면 조회 조건에서 복합인덱스에서 정해준 모든 컬럼을 조회 조건으로 사용해야 탈 확률이 높아진다.
유의할 점
- 인덱스는 NOT NULL 값에 대해서만 생성되기 때문에 NULL 여부를 체크하는 비교문은 인덱스를 사용하지 못함.
인덱스를 사용해야 할 컬럼
1. WHERE 절이나 조인 조건에서 자주 사용되는 열
2. 열이 광범위한 값을 포함할 때
인덱스를 사용하지 않아야 할 컬럼
1. 테이블에 데이터가 적은 경우
2. where 절에 자주 사용되지 않는 열
3. 테이블이 자주 갱신 될 때
'프로그래밍' 카테고리의 다른 글
[JAVASCRIPT] Selector 시 특수문자 (0) | 2016.12.24 |
---|---|
[JAVA] iBatis 에서 오라클 프로시저 호출하기 (0) | 2016.12.24 |
[JAVASCRIPT] 자바스크립트 바이트 체크 (0) | 2016.12.24 |
[Spring] 스프링 스케줄러 (Spring QuartzJobScheduler) (0) | 2016.12.24 |
[ETC] DATA URL Scheme (0) | 2016.12.24 |
- Total
- Today
- Yesterday
- 빅토리아폴스
- 나미비아
- 빈트후크
- 캄보디아
- Cusco
- 햄버거
- Namibia
- 우유니
- aguas calientes
- 남미 저가항공
- Oracle
- 쿠스코
- jQuery
- 후마리
- 성스러운 계곡
- 아구아스 칼리엔테스
- 마추피추
- 칼라마
- Cambodia
- 볼리비아
- Uyuni
- 토레스 델 파이네
- 족발
- 성계 투어
- 킹덤 호텔
- calama
- 남미
- 칠레
- 푸에르토 나탈레스
- 애드센스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |