오라클 성능 고도화 원리와 해법 II (2016년)
테이블 Random 액세스 최소화 튜닝 0 0 4,016

by 구루비 RANDOM ACCESS 랜덤액세스 클러스터링팩터 [2017.03.13]


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을 제거하는 작업 입니다.

"구루비 주주클럽 스터디모임" 에서 2016년에 "오라클 성능 고도화 원리와 해법 II " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3333

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입