3.1.1 테이블 랜덤 엑세스 (테이블 랜덤 엑세스가 성능에 미치는 영향 복습)
인덱스 ROWID는 물리적 주소? 논리적 주소?
- SQL이 참조하는 컬럼을 인덱스가 모두 포함하는 경우가 아니면, 인덱스를 스캔한 후에 반드시 테이블을 액세스한다
- 인덱스를 스캔하는 이유
- 검색 조건을 만족하는 소량의 데이터를 인덱스에서 빨리 찾고 거기서 테이블 레코드를 찾아가기 위한 주소값, 즉 ROWID를 얻으려는 데 있다
- 인덱스 Rowid
- 논리적 주소이다
- 디스크 상에서 테이블 레코드를 찾아가기 위한 위치 정보를 담는다
- 포인터가 아니다!!!!
- 모든 데이터가 캐싱되어 있더라도 테이블 레코드를 찾기 위해 매번 DBA 해싱과 래치 획득 과정을 반복해야한다 → 고비용 구조이다
3.1.2 인덱스 클러스터링 팩터
- 클러스터링 팩터 (Clustering Factor, 이하 'CF')
- 특정 컬럼을 기준으로 같은 값을 갖는 데이터가 서로 모여있는 정도
- CF가 좋은 컬럼에 생성한 인덱스는 검색 효율이 매우 좋다
- 테이블 액세스량에 비해 블록 I/O 가 적게 발생한다
- 최후의 방법이다
- 수동이기 때문에 권장하지 않는다
- 서버부담이 높고, 시간이 오래걸린다
3.1.3 인덱스 손익분기점
온라인 프로그램 튜닝 vs 배치 프로그램 튜닝
- 온라인 프로그램
- 보통 소량 데이터를 읽고 갱신한다
- 인덱스를 효과적으로 활용하는 것이 중요하다
- 배치 브로그램
- 대량 데이터를 읽고 갱신한다
- 항상 전체범위 처리 기준으로 튜닝해야한다
3.1.4 인덱스 컬럼 추가 ✨
select /*+ index(emp emp_x01) */ *
from emp
where deptno = 30
and sal >= 2000;
- 위 조건을 만족하는 사원은 단 한 명인데, 이를 찾지 위해 테이블을 여섯 번 액세스하였다
-- EMP_X01 : [DEPTNO + JOB + SAL]
DROP INDEX EMP_X01;
CREATE INDEX EMP_X01 ON EMP(DEPTNO, JOB, SAL);
- 인덱스에 새로운 컬럼(sal)을 추가한다 → 인덱스 스캔량은 줄지 않지만, 테이블 랜덤 액세스 횟수를 줄여준다
'SQL 튜닝 > Ch03 인덱스 튜닝' 카테고리의 다른 글
인덱스 설계(4) (0) | 2024.11.15 |
---|---|
인덱스 스캔 효율화 (3) //2는 없습니다 (0) | 2024.11.15 |