[SQL 성능개선하기] - 옵티마이저 - 실전예제문제

이동찬·2023년 1월 17일
0

SQL

목록 보기
13/22

실전문제

  • A라고 되어있는 테이블은 2개의 컬럼으로 만들어놓은 primary key가 있다. B라고 되어있는 테이블은 4개의 컬럼으로 이루어진 EC_TASK_TERM_IDX00을 가지고 있다.

RBO

  • 지금 WHERE절 조건은 B라는 테이블에 걸려져있다.
  • B에서 먼저 읽어와서 A를 조인(B -> A)
  • 작성한대로만 바라만 봐야하는 것이 RBO(RULE BASED OPTIMIZER)이다. 즉, 조건을 갖고있는 B로부터 먼저 찾아들어가는것이 RBO이다.

CBO

  • B.COURSE_CODE와 B.TASK_NO과 A와 조인조건으로 사용되어지고 있다.
  • A에 대해서도 B와 마찬가지로 같은 조건이 이미 입력이 되어있다라고 보는 것이 CBO이다.
  • A에 대해서도 이미 데이터를 찾게하는 조건이 PK에 대해서도 존재한다.
    EC_TASK_PK : COURSE_CODE+TASK_NO 즉, A에 대한 테이블은 1건의 데이터를 찾게되어있다.
  • B는 EC_TASK_TERM_IDX00 : COURSE_CODE+TASK_NO+YEAR+COURSE_SQ_NO는 YEAR를 빼고 나머지 3부분에 값을 할애하고 있다. 그러므로, B같은 경우는 1건을 찾는것이 아니고 여러건을 찾는 것이다.
  • 그러므로 데이터를 적게 찾는 테이블은 A가되므로 CBO는 A테이블에서 데이터를 먼저 찾게된다.

실행계획

RBO

  • 먼저 선택되어 들어가지는 테이블이 B이다.(EC_TASK_TERM)
  • 연결되어있는 테이블이 A로 선택이 되어있다.
    TABLE ACCESS MODE : ANALYZED (BY INDEX ROWID) OF 'EC_TASK' (TABLE)

CBO

  • HINT : FIRST_ROWS
  • 먼저 선택된 테이블은 A가된다.
  • 결국에는 상대적으로 CBO에 반영된 숫자가 RBO에 반영된 숫자보다 적은것을 알 수 있다. 그렇기에 CBO로 나타낸 것이 성능상 더 좋은것으로 알 수 있다.

수정문

  • RBO에서 동작을 시키더라도 CBO와 같이 조인 순서가 지켜지도록 하는 것이 중요하고, 모든 조건이 B로 나타나있었는데 일반적으로 B로 해석할 가능성이 높다. 누가 보더라도 'A에서 먼저 찾는구나'라는 것을 알 수 있도록 위의 사진과 같이 SQL문을 수정해주어야한다.(가독성↑)
  • 이렇게 고친다면 RBO와 CBO로 돌려도 똑같은 실행계획을 얻을 수가 있다!(A(DROP IN)->B)

쿼리 수정 후 튜닝계획

0개의 댓글

관련 채용 정보