SQL 튜닝/Ch03 인덱스 튜닝

테이블 액세스 최소화 (1)

developer-soyun 2024. 11. 15. 14:51

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)을 추가한다 → 인덱스 스캔량은 줄지 않지만, 테이블 랜덤 액세스 횟수를 줄여준다