순차I/O 개념 자체가 물리적뿐만 아니라
논리적으로 순차적으로 읽는 것도 순차I/O임
인덱스 리프블록을 연결리스트 따라서 쭉 읽는 것도 순차I/O에 해당
클러스터링 인덱스는 범위검색(>=)에 특화되어있음
secondary 인덱스는 범위검색시 많은 테이블 액세스가 발생할 수 있는데
클러스터링 인덱스는 리프노드에 칼럼 다 있으니까 테이블 액세스 필요X
select *
from t
where id >= 100
secondary 인덱스 리프노드 1개에 데이터 100개씩 저장
클러스터링 인덱스 리프노드 1개에 데이터 100개씩 저장을 가정함
위 조건 만족하는 레코드는 1000건
secondary 인덱스 (id, rowid)로 저장해놓았다면
인덱스 리프노드를 순차적으로 (레코드 100개 * 10노드)
읽고 이후 1000건에 대해
테이블 랜덤 액세스가 최대 1000번 일어남(물론 이보다는 적음)
클러스터링 인덱스의 경우
리프노드 10건만 읽고 바로 결과 반환함
정리하면
secondary 인덱스는 인덱스 스캔과정에서 10건
테이블 액세스 과정에서 최대 1000건 -> 1010 I/O 발생
클러스터링 인덱스는 리프노드 10건 I/O 발생
물론 클러스터링 인덱스면 리프노드에 칼럼들 다 박아놔서
secodary 인덱스에 비해 리프노드 1개에 들어갈 수 있는 레코드가 적음
그래서 리프노드 스캔과정에서 조금 더 I/O가 발생할 수는 있는데
테이블 액세스를 안하니까 범위스캔(>=)에 유리하다고 보면됩니다
오늘은 많이들 사용하시는 페이징 관련 문제 내볼게요
뇌에 업데이트 완료 - dc App