티스토리 뷰

1. 인덱스 레인지 스캔


쿼리 : SELECT * FROM emp WHERE FIRST_NAME BETWEEN 'EBBE' AND 'GAD';


인덱스 레인지 스캔은 루트 노드로부터 비교를 시작해 리프노드에 도달하여, 리프노드의 시작위치부터 순차적으로 읽는 방식이다. 그리고 범위에 마지막에 해당하는 

데이터의 주소를 찾을 때까지 스캔하는 방식이다. 최종적인 데이터까지 스캔을 하면 데이터를 사용자에게 반환하고 쿼리를 종료한다. 리프노드에서 최종 데이터의 주소를 발견하면

주소를 통해 데이터 파일을 읽어온다. 그리고 데이터를 파일에서 데이터를 읽는 것은 랜덤 I/O 이다. 만약 최종적으로 찾는 데이터가 5개라면, 5번의 랜덤I/O가 발생하는 것이다.

인덱스를 통해 해당 데이터의 주소를 찾는 것이 비용이 많이 들지는 않지만, 랜덤 I/O에는 비용이 많이 발생한다.

그렇기 때문에 앞서 인덱스를 통해 찾으려는 데이터 레코드가 20 ~ 25%를 넘으면 랜덤 I/O 때문에 전체 데이터를 읽고 필터링 하는 것이 빠르다는 것이다!


2. 인덱스 풀 스캔


인덱스 레인지 스캔은 특정 범위에 해당하는 데이터만을 읽는 방식이지만, 인덱스 풀 스캔은 처음부터 끝까지 모두 읽는 방식을 인덱스 풀 스캔이라고 한다.

예를들어  WHERE NAME='A' AND AGE ='20' AND DEPT = 'IT" 조건으로 검색할 때, 세 개의 칼럼이 모두 인덱스일 때 사용된다. (조건문이 인덱스만으로 구성될 때)

이럴 때는 전체 레코드를 검색하는 것보다는 인덱스를 통해서만 검색하는 것이 더 빠르기 때문에 빠르다. 


3. 루스 인덱스 스캔


앞서 언급된 인덱스 레인지 스캔과 풀 스캔은 시작부터 끝까지 모든 데이터를 읽었는데, 이를 타이트 인덱스 스캔 이라고도 한다. 그리고 반대적인 것이 루스 인덱스 스캔인데, 

루스 인덱스 스캔은 전체 데이터를 읽는 것이 아니라 스캔하는 과정에서 필요하지 않는 인덱스 키값은 무시하고 넘어가는 스캔 방식을 의미한다.

데이터베이스에 옵티마이저는 WHERE 조건문을 통해 필요한 데이토와 불필요한 데이터를 구분할 수 있기 때문에 조건게 만족하지 인덱스는 무시하고 넘긴다.

루스 인덱스 스캔은 Group by 또는  max, min 과 같은 집합함수에서 많이 사용된다.

쿼리 : SELECT DEPT_NO, MIN(EMP_NO) FROM DEPT_NO BETWEEN '001' AND '002' GROUP BY DEPT_NO

위와 같은 쿼리에서는 인덱스는 정렬되어 있기 때문에 가장 작은 값 하나만 읽고 뒷 부분은 모두 스킵하는 방식으로 동작할 것이다.(모두 스캔하는 것이 아닌)


4. 인덱스 스캔 방향


쿼리 : SELECT * FROM WHERE DEPT = '100' ORDER BY DETP;

인덱스는 정렬되었기 때문에 인덱스를 재정렬한 후, 읽은 데이터를 반환하는 것이 아닌, 인덱스를 읽는 방향을 역순으로 바꿈으로서 인덱스를 읽어 데이터를 반환한다.

결국 정렬방법에 따라 인덱스를 읽는 방향이 결정되는 것이다.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함