h1.5. 테이블 Random 액세스 최소화 튜닝
h3.(1) 인덱스 컬럼추가

  • EMP 테이블에 현재 PK 이외에 deptno + job 순으로 구성된 emp_x01 인덱스가 구성되어있는경우
 
select /*+ index(emp emp_x01) */ 
       *
  from emp 
 where deptno = 30
   and sal >= 2000

  • 위의 조건을 만족하는 사원은 한명인데 테이블 엑세스는 6번 발생한다.

  • 인덱스 구성을 deptno + sal 순으로 바꿔주면 좋지만 운영환경에서는 인덱스 구성을 함부로
    바꾸기가 쉽지않다 기존 인덱스를 사용하는 SQL이 있을수있기 때문이다.
 
select * from emp  where deptno = 30 and job >= 'CLERK'

  • 인덱스를 새로만들어야겠지만 이런 식으로 인덱스를 추가해 나가다 보면 테이블 마다 인덱스가 수십개씩 달릴수 있다. ( 인덱스 관리 비용증가 , DML 부하에 따른 트랜잭션 성능저하 )
인덱스에 컬럼을 추가한 후

  • 기존 인텍스에 sal 컬 럼을 추가하는 것만으로 큰 효과를 거둘 수 있다.
  • 인텍스 스캔량은 줄지 않지만 테이블 Random 액세스 횟수를 줄여주기 때문이다.

h3.(2) PK 인덱스에 컬럼 추가

  • 단일 테이블을 PK로 액세스할 때는 단 한 건만 조회
  • NL 조인할 때 Inner쪽(=right side)에서 액세스될 때는 Random 액세스 부하가 많이 발생.
  • Outer 테이블에서 Inner 태이블 쪽으로 조인 액세스가 많은 상황에서 Inner 쪽 필터 조건에 의해 버려지는 레코드가 많다면 그 비효율은 매우 심각하다
  • PK 인텍스에는 컬림을 추가할 수가 없다.
  • 이럴때 PK 컬럼 + 필터조건 컬럼 형태의 새로운 Non-Unique 인텍스를 추가해 PK 제약을 설정한다변 인텍스 개수를 줄일 수 있다.

a1ter table dept drop primary key;
create index dept_x01 on dept(deptno, 1oc);
alter table dept add
constraint dept_pk praimary key(deptno) using index dept_x01;

인덱스 추가전


select /*+ ordered use_nl(d) */ * 
  from emp e, dept d 
  where d.deptno=e.deptno and d.loc='NEW YORK

Rows     Row Source Operation
-------  ---------------------------------------------------
      3   NESTED LOOPS  (cr=25 pr=0 pw=0 time=422 us)
     14    TABLE ACCESS FULL EMP (cr=8 pr=0 pw=0 time=139 us)
      3    TABLE ACCESS BY INDEX ROWID DEPT (cr=17 pr=0 pw=0 time=568 us)
     14     INDEX UNIQUE SCAN DEPT_PK (cr=3 pr=0 pw=0 time=258 us)

DEPT.LOC 를 인덱스 추가 후


select /*+ ordered use_nl(d) */ * 
  from emp e, dept d 
  where d.deptno=e.deptno and d.loc='NEW YORK

Rows     Row Source Operation
-------  ---------------------------------------------------
      3 TABLE ACCESS BY INDEX roWID DEPT (cr=14 pr=O pw=O time=302 us)
     18  NESTED LOOPS (cr=12 pr=O pw=O t time=1483 us)
     14   TABLE ACCESS FULL EMP (cr=8 pr=o pw=O time=145 us)
      3   INDEX RANGE SCAN DEPT_X01 (cr=4 pr=O pw=O time=220 us)

그냥 INDEX 만드는거랑 무슨 차이일지?

h3.(3) 컬럼 추가에 따른 클러스터링 팩터 변화

  • 인텍스에 컬럼을 추가함으로써 테이블 Random 액세스 부히를 줄이는 효과
  • 인텍스 클러스터링 팩터가 나빠진다

클러스터링 팩터 조회


 select clustering_factor from user_indexes where index_name='인덱스명';

h3.(4) 인텍스만 읽고 처리

  • 테이블 Random 액세스가 아무리 많더라도 필터 조건에 의해 버려지는레코드가거의 없다면?
  • 테이블 액세스가 발생하지 않도록 모든 필요한 컬럼을 인텍스에 포함시키는 방법
  • MS-SQL Server에서 시용하는 용어긴 하지만 그런 인텍스를 'Covered 인텍스' 라 부른다.
  • 조건절 컬럼에 INDEX가 빠져있는 경우 버려지는 레코드가 없어도(비효율X) 이값을 체크하기 위한 테이블 Random 액세스 부하가 심할할수도 있다.

h3.(5) 버퍼 Pinning 효과 활용
*오라클의 경우, 한번 입력된 테이블 레코드는 절대 rowid가 바뀌지 않는다.

  • rowid 값을 이용해 레코드를 조회하는 것이 기능하다,

select * from emp where rowid = : rid

  • 실행계획상에는 'Table Access By Index ROWID' 대신 아래와 같이 'Table Access By User ROWID' 라고 표시된다.
  • 미리 알고 있던 rowid 값이 아니더라도 아래처럼 인라인 뷰에서 읽은 rowid 값을 이용해 테이
    블을 액세스하는 것도 가능하다.

h3.(6) 수동으로 클러스터링 팩터 높이기

  • 테이블에는 데이터가 무작위로 입력되는 반면, 그것을 가리키는 인텍스는 정해진 키 (key) 순으정렬되기 때문에 대개 CF가 좋지 않게 마련이다.
    *해당 인텍스 기준으로 테이블을 재생성함으로써 CF를 인위적으로 좋게 만드는 방법을 생각해 볼수 있다.
    (주의:인덱스가 여러개인 상황에서 특정 인덱스 기준으로 테이블을 재정렬하면 다른 인덱스의 CF가 나빠질수 있다.)
  • 테이블이 파티셔닝 돼 있으면 관리적 부담도 적다 ( 마지막 파티션만 Reorg )
  • 병렬쿼리처리시(예:이관작업) 데이터를 무작위로 흩어지는 경향이 있어서 클러스터링 팩터가 나빠진다.

Reorg

대상 Table의 Data를 Physical하게 재편성하여 DML 작업으로 인한 Fragmentation을 제거하는 작업 입니다.