Index Scan vs Table Full Scan
Index Scan vs Table Full Scan
Table Full Scan
- 테이블에 존재하는 모든 데이터를 읽는 방식
- 블록들이 물리적으로 인접해 있기 때문에 한 번의 I/O에 여러 블록을 읽을 수 있음
- Random access가 아닌 Sequential access를 사용
- 인덱스를 사용할 수 없거나 인덱스를 사용하는 것이 더 효율성을 낮추는 경우 사용
- 넓은 범위의 데이터를 가져오는 경우 좋음
- 캐시에서 원하는 데이터를 못 찾은 경우 이 방법을 통해 한 번의 I/O를 통해 인접한 여러 블록을 같이 가져오면 공간 지역성을 활용 가능함
Index Scan
- 인덱스를 구성하는 컬럼의 값을 기반으로 데이터를 읽는 방식
- Random access를 수행하고, 한 번의 I/O에 한 블록만 읽을 수 있음
- 읽을 데이터가 많으면 많을수록 Table full scan에 비해 비효율적
- 큰 테이블에서 소량의 값을 찾을 때 유용
- Index Scan 에는 다음과 같은 여러 방식이 있음
Index Scan 종류
- Index Range Scan
- 인덱스를 활용해 루트에서 리프 블록까지
수직적
으로 탐색하고, 해당 블록부터 필요한 범위까지 수평적
으로 탐색하는 방법 - B+ Tree 인덱스의 가장 일반적인 형태
- 인덱스의 선두 컬럼이
가공되지 않고
Where 절에 사용되는 경우에 사용 가능한 scan 방법- Ex)
select * from t where a + 2 = 4;
와 같은 경우에는 사용되지 못함
- 특정 범위 내의 값을 찾거나, non-unique index를 사용할 때 주로 사용됨
- 오름차순으로 정렬된 결과를 얻음
- Index Full Scan
- 인덱스의
수직적
탐색 없이, 모든 리프 블록을 수평적
으로만 탐색하는 방법 - 인덱스의 선두 컬럼이 조건 절에 없는 경우에 사용 가능
- 테이블이 너무 커서 Table Full Scan의 부담이 큰 경우에 사용
- 인덱스 스캔 단계에서 대부분의 데이터를 필터링하고 아주 소량의 데이터에만 실제 테이블의 엑세스가 필요한 경우, 굉장히 유용
- 인덱스의 크기는 실제 테이블보다 훨씬 작기 때문에 인덱스 전체를 탐색하는 비용이 작음
- 그러나 이런 쿼리가 있다면, 그냥 해당하는 인덱스를 만드는 것이 더 유용할 수 있음
- 이 방법 역시 오름차순으로 정렬된 데이터를 얻을 수 있음
- Index Unique Scan
- 인덱스의
수직적
탐색 으로만 데이터를 찾는 방법 Unique
인덱스를 등호
조건으로 탐색할 때 사용- 하나의 유일한 데이터를 찾으므로 수평적 탐색이 필요 없음
- Index Skip Scan
- Multi-column 인덱스에서 후행 칼럼이 조건 절에 사용될 때 사용 가능한 방법
- 조건절에 빠진 선행 인덱스 컬럼의 고유 값이 적고 후행의 고유 값이 많은 경우 사용됨
- Ex) 선행: 10, 20, 30, 40, 후행: 1 ~ 10000 인경우, 후행 조건: 2000 ~ 4000
- 이 경우 선행이 10 인 경우에 대해서는, 후행이 2000 ~ 4000 인 경우만 찾으면 됨
- 선행이 10이고 후행이 4001 ~ 10000인 경우는
스킵
해도 됨!
- Index Fast Full Scan
- Index Full scan에서 한 번의 I/O에 여러 블록 읽기가 추가된 방식
- 인덱스 트리 구조를 무시하고 물리적으로 저장된 순서대로 리프 블록을 읽음
- 속도는 더 빠르나 데이터를 정렬된 상태로 얻을 수는 없음
- Index Range Scan Descending
- Index Range Scan과 비슷하나, 인덱스를 뒤쪽에서 앞쪽으로 스캔하므로 내림차순으로 정렬된 결과를 얻음
References
- https://imnkj.tistory.com/49
- https://hoon93.tistory.com/53
- https://myjamong.tistory.com/237
- https://velog.io/@tothek/%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EA%B8%B0%EB%B3%B8-INDEX-SCAN%EC%A2%85%EB%A5%98
- https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=gglee0127&logNo=221336088285