SQL

옵티마이저

망재이 2023. 2. 26. 16:33
  • 옵티마이저란 : 사용자가 실행한 SQL을 해석하고, 데이터 추출을 위한 실행계획을 수립하는 프로세스
  • 옵티마이저 종류(오라클) ; 다른 DBMS들은 CBO만 제공
    - RBO : 초창기 버전부터 제공함
    - CBO : v10g부터 기본 설정으로 적용되고 있음

 

  • RBO(Rule Based Optimizer)
    - 기본적으로 15개의 순위가 매겨진 규칙 존재! -> 이를 기초로 실행계획 수립
    - SQL에 대한 실행계획이 하나 이상일 경우 순위가 높은 규칙을 이용
    - 수립될 계획 예측이 쉬우므로 개발자가 원하는대로 처리하기에 유용

 

  • CBO(Cost Based Optimizer)
    - 대상 row들을 처리하는데 필요한 자원 사용을 최소화해서 궁극적으로 데이터를 빨리 처리하는 데 목표
    - 비용 산정 요소 : 각종 통계 정보, Hint, 연산자, Index, Cluster ...
  • CBO의 통계정보 (중요!)
    - CBO의 성능을 최적의 상태로 유지시키기 위해 테이블, 인덱스, 클러스터 등을 대상으로 정기적으로 ANALYZE작업을 수행
    - 최수배용을 계산할 때 중요하게 사용
//테이블이 가지고 있는 전체 데이터를 대상으로 할 때
ANALYZE TABLE emp COMPUTE STATISTICS;

//데이터의 양이 너무 많을 때 표본을 정해서 실행
ANALYZE TABLE emp ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE emp ESTIMATE STATISTICS SAMPLE 5 ROWS;

SELECT table_name, num_rows, last_analyzed 
	FROM user_tables WHERE table_name IN('EMP','DEPT');
//데이터의 값이 잘 나온다면 analyze 실행 완료, 테이블명만 나온다면 실패

 

  • RBO, CBO의 실행계획 비교
SELECT e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND e.deptno = 10;

1) CBO : 기존의 where 조건을 갖지 않았던 dept 테이블을 먼저 정보를 읽어들이는 테이블로 선언

- access("d"."deptno" = 10) => filter("e"."deptno" 10)
2) RBO : 기존의 where 조건을 가지고 있던 테이블의 조건을 먼저 읽어들임, 주어진 조건 순서대로 진행

- filter("e"."deptno" = 10) => access("e"."deptno" = "d"."deptno")

 

=> 동일 SQL에 대해서 각 옵티마이저가 수립한 실행계획은 서로 다를 수 있고, 이는 퍼포먼스가 옵티마이저에 따라 다르다는 것을 의미!, 옵티마이저의 종류에 따라 달라지는 DB성능의 차이점을 이해하는 것이 중요!

728x90