최보름달
[SQL] 전체 테이블 스캔, 인덱스 스캔 본문
전체 테이블 스캔
테이블에 존재하는 모든 데이터를 읽으면서 조건에 맞으면 결과로 추출하고, 조건에 맞지 않으면 버리는 방식
모든 결과를 찾을 때까지 시간이 오래 걸릴 수 있다.
옵티마이저가 전체 테이블 스캔을 하는 이유는 다음과 같다.
- SQL문에 조건이 존재하지 않는 경우 : 테이블에 존재하는 모든 데이터가 답이 되는 경우를 의미한다.
- SQL문에 주어진 조건에 사용 가능한 인덱스가 존재하지 않는 경우 : 인덱스가 없다면 데이터 액세스 가능한 방법은 모든 테이블의 데이터를 읽는 방법 뿐이다. 또한, 주어진 조건에 사용 가능한 인덱스는 존재하지만 함수를 사용해서 컬럼을 변경한 경우에도 인덱스 사용이 불가하다.
- 옵티마이저 취사 선택 : 조건을 만족하는 데이터가 많은 경우, 인덱스가 존재해도 전체 테이블 스캔을 할 수 있다.
- 그 외 : 병렬처리 방식으로 처리하는 경우, 전체 테이블 스캔 방식의 힌트를 사용한 경우 전체 테이블 스캔 방식이 사용될 수 있다.
인덱스 스캔
주로 사용되는 트리 기반 인덱스를 기준으로 설명한다.
인덱스 스캔은 인덱스를 구성하는 컬럼 값을 기반으로 데이터를 추출하는 액세스 기법이다.
자주 사용되는 방식
- 인덱스 유일 스캔(index unique scan) : 유일 인덱스를 사용하여 단 하나의 데이터를 추출하는 방식. 중복을 허락하지 않는다. =로 값이 주어지면 결과는 최대 1건이다.
- 인덱스 범위 스캔(index range scan) : 한 건 이상의 데이터를 추출하는 방식.
- 인덱스 역순 범위 스캔(index range scan descending) : 인덱스 리프 블록의 양방향 링크를 이용하여 내림차순으로 데이터를 읽는 방식. 이 방식을 이용해서 최대값을 쉽게 찾을 수 있다.
전체 테이블 스캔과 인덱스 스캔 방식 비교
전체 테이블 스캔: 인덱스 유무과 관계 없이 항상 가능. 한번의 I/O 요청으로 여러 블록을 한꺼번에 읽음. 테이블 대부분의 데이터를 찾을 때는 전체 테이블 스캔 방식이 유리함.
인덱스 스캔 : 적절한 인덱스가 있을 때만 사용 가능. 레코드 식별자를 이용해서 검색하는 데이터의 정확한 위치를 알고서 데이터를 읽기 때문에 불필요하게 다른 블록을 읽지 않음. 대용량 데이터 중에서 극히 일부만 찾을 때는 인덱스 스캔이 유리함.
kdata 한국데이터진흥원에서 출간한 SQL 전문가 가이드 2013 Edition을 요약했습니다.
'문송한 회사생활 > SQL 공부' 카테고리의 다른 글
오라클 DBMS 설치 없이 SQL 온라인으로 연습하기 (0) | 2020.08.23 |
---|---|
[SQL] 조인 수행 원리 (NL, Hash, Sort Merge Join) (0) | 2020.08.22 |
[SQL] 인덱스 (B-트리 인덱스, 클러스터형 인덱스) (0) | 2020.08.21 |
[SQL] 옵티마이저 실행계획 (0) | 2020.08.21 |
[SQL] 옵티마이저(optimizer), 규칙기반/ 비용기반 옵티마이저 (0) | 2020.08.20 |