인덱스 탐색 (index seek)
이라고 한다.인덱스 스캔 (index scan)
이라고 한다.쿼리가 필요로 하는 데이터에 따라 3번 과정은 필요하지 않을 수도 있는데, 이를 커버링 인덱스 (covering index)
라고 한다.
커버링 인덱스로 처리되는 쿼리는 디스크의 레코드를 읽지 않아도 되기 때문에 랜덤 읽기가 상당히 줄어들고 성능은 그만큼 빨라진다.
인덱스 레인지 스캔과 마찬가지로 인덱스를 사용하지만 인덱스 레인지 스캔과는 달리 인덱스의 처음부터 끝까지 모두 읽는 방식이다.
쿼리의 조건절에 사용된 칼럼이 인덱스의 첫 번째 칼럼이 아닌 경우 인덱스 풀 스캔 방식이 사용된다.
ex - (A, B, C) 순대로 인덱스가 만들어져 있지만 쿼리의 조건절은 B or C 칼럼으로 검색하는 경우
이 방식은 인덱스 레인제 스캔보다는 빠르지 않지만 테이블 풀 스캔보다는 효율적이다. 인덱스에 포함된 칼럼만으로 쿼리를 처리할 수 있는 경우
테이블의 레코드를 읽을 필요가 없기 때문이다. 인덱스의 전체 크기는 테이블 자체의 크기보다는 훨씬 작으므로 인덱스 풀 스캔은 테이블 전체를
읽는 것보다는 적은 디스크 I/O로 쿼리를 처리할 수 있다.
앞에 두 접근 방법 (인덱스 레인지 스캔, 인덱스 풀 스캔)은 루스 인덱스 스캔과는 상반된 의미에서 타이트 인덱스 스캔으로 분류한다.
루스 인덱스 스캔은 말 그대로 느슨 또는 듬성듬성하게 인덱스를 읽는 것을 의미한다.
루스 인덱스 스캔은 인덱스 레인지 스캔과 빗븟하게 작동하지만 중간에 필요치 않은 인덱스 키 값을 건너뛰는 형태로 처리한다.
일반적으로 GROUP BY 또는 집합 함수 중 MAX(), MIN() 함수에 대해 최적하를 하는 경우 사용된다.
SELECT dept_no, MIN(emp_no)
FROM dept_emp
WHERE dep_no BETWEEN 'd002' AND 'doo4'
GROUP BY dept_no;
dept_no 와 emp_no 라는 두 개의 칼럼으로 인덱스가 생성되어 있는 dept_emp 테이블이 있을 때, 이 인덱스는 (dept_no, emp_no) 조합으로 정렬
되어 있어서 dept_no 그룹 별 첫 번째 레코드의 emp_no 값만 읽으면 된다.
즉, 인덱스에서 WHERE 조건을 만족하는 범위 전체를 다 스캔할 필요가 없다는 것을 옵티마이저가 알고 있기 때문에 조건에 만족하지 않는 레코드는 무시하고
다음 레코드로 이동한다.