2022. 9. 19. 00:42ㆍ개발 관련 책 읽기/친절한 SQL 튜닝
클러스터링 팩터(CF)란 '특정 컬럼을 기준으로 같은 값을 갖는 데이터가 서로 모여있는 정도를 의미한다'
CF가 좋을수록 검색 효율이 매우 좋다.
그 이유는, CF가 좋을수록 데이터가 물리적으로 근접해 있다는 의미로 같은 블록 안에서 데이터를 접근할 수 있다는 의미가 된다. => 즉, 블록 I/O 비용이 적게 발생한다는 의미이다.
좀 더 깊게 들어가 본다면 인덱스를 통한 수직적 + 수평적 탐색으로 접근한 Leaf 블록에서 얻은 ROWID로 데이터 블록을 접근하는데 오라클은 래치 획득과 해시 체인 스캔 과정을 거쳐 어렵게 찾아간 테이블 블록에 대한 포인터(메모리 주솟값)을 바로 해제하지 않고 일단 유지한다 - > '버퍼 Pinning'이라고 한다.
이 상태에서 다음 인덱스 레코드의 ROWID를 읽었을 때 '직전과 같은' 테이블 블록을 가리킨다. 그러면 위 과정의 래치 획득 + 해시 체인 스캔 과정을 생략하고 바로 테이블 블록을 읽을 수 있게 된다.
따라서, 논리적인 블록 I/O 과정을 생략을 통해 블록 I/O 비용이 적게 되는 것이다.
CF가 안 좋은 인덱스를 사용하면 테이블을 액세스하는 횟수만큼 블록 I/O가 발생한다.
인덱스 ROWID를 이용한 테이블 액세스는 고비용 구조이므로 읽어야 할 데이터가 일정량을 넘는 순간, 테이블 FULL SCAN 하는 것보다 오히려 더 느려진다. 이를 흔히 '인덱스 손익분기점'이라고 부른다.
인덱스를 이용한 테이블 액세스가 Table Full Scan 보다 더 느려지게 만드는 핵심적인 두 가지 요인이 있는데 다음과 같다.
1.Table Full Scan은 시퀜셜 액세스인 반면, 인덱스 ROWID를 이용한 테이블 액세스는 랜덤 액세스 방식이다.
2.Table Full Scan은 Multi Block I/O인 반면, 인덱스 ROWID를 이용한 테이블 액세스는 Single BLock I/O 방식이다.
정리하자면, CF가 테이블 엑세스하는 비용에 영향을 끼치게 되므로, CF의 분포도 확인이 꼭 필요하다
'개발 관련 책 읽기 > 친절한 SQL 튜닝' 카테고리의 다른 글
4. NL 조인[조인 튜닝] (0) | 2022.09.19 |
---|---|
3. 부분 범위 처리[인덱스 튜닝] (0) | 2022.09.19 |
1. 인덱스 ROW ID 분석 및 테이블 엑세스 구조 파악 (0) | 2022.05.13 |