3. 인덱스 튜닝 - a. 테이블 액세스 최소화
SQL 튜닝은 랜덤 I/O와 전쟁이다.
3.1.1 테이블 랜덤 액세스
인덱스에 대한 맹신 또는 섣부른 자신감
대량의 데이터를 조회할 때 인덱스가 한없이 느려짐.
인덱스 ROWID는 물리적 주소? 논리적 주소?
SQL이 참조하는 컬럼을 인덱스가 모두 포함하는 경우가 아니면, 인덱스를 스캔한 후에 반드시 테이블을 액세스한다.
인덱스 ROWID는 물리적 주소보다 논리적 주소에 가깝다. 물리적으로 직접 연결되지 않고 테이블 레코드를 찾아가기 위한 논리적 주소 정보를 담고 있기 때문이댜.
정리하면 인덱스 ROWID는 논리적 주소다. 디스크 상에서 테이블 레코드를 찾아가기 위한 위치 정보를 담는다. (프로그래밍에서 말하는) 포인터가 아니며, 테이블 레코드와 물리적으로 직접 연결된 구조는 더더욱 아니다.
3.1.2 인덱스 클러스터링 팩터(Clustering Factor)
클러스터링 팩터는 특정 컬럼을 기준으로 같은 값을 갖는 데이터가 서로 모여있는 정도를 의미한다. CF가 좋은 컬럼에 생성한 인덱스는 검색 효율이 매우 좋다.
[그림 3-4 넣을것]
위의 그림은 인덱스 CF가 가장 좋은 상태를 도식화 한것으로서, 인덱스 레코드 정렬 순서와 테이블 레코드 정렬 순서가 100퍼 일치하는것을 볼 수 있다.
반면 아래의 그림 3-5는 클러스터링 팩터가 가장 안좋은 상태를 도식화한것으로서, 인덱스 레코드 정렬순서와 테이블레코드 정렬순서가 전혀 일치하지 않는다.
3.1.3 인덱스 손익분기점
Index Range Scan에 의한 테이블 액세스가 Table Full Scan보다 느려지는 지점을 흔히 인덱스 손익분기점이라고 부른다.
테이블 스캔이 항상 좋은것도 아니며 인덱스 스캔이 항상 좋은것도 아니다.
3.1.4 인덱스 컬럼 추가
테이블 액세스 최소화를 위해 가장 일반적으로 사용하는 튜닝 기법은 인덱스에 컬럼을 추가하는 것이다.
3.1.5 인덱스만 읽고 처리
Include 인덱스
3.1.6 인덱스 구조 테이블
3.1.7 클러스터 테이블
클러스터 테이블에는 인덱스 클러스터와 해시 클러스터 두 가지가 있다.
인덱스 클러스터 테이블
인덱스 클러스터 테이블은 클러스터 키 값이 같은 레코드를 한 블록에 모아서 저장하는 구조다. 한 블록에 모두 담을 수 없을 때는 새로운 블록을 할당해서 클러스터 체인으로 연결한다. 여러 테이블 레코드를 같은 블록에 저장할 수도 있는데, 이를 다중 테이블 클러스터 라고 부른다.
인덱스 손익 분기점
최후의 수단일뿐 일상적인 사용 x
랜덤 엑세스가 아예 발생하지 않도록 테이블응ㄹ 인덱스 구조로 생성한다?
인덱스 구조 테이블
클러스터 테이블