SQL 실행계획, 예상 실행계획, 실제 실행계획, 실행계획 제어 힌트를 알아보자.
SQL 실행계획
: SQL을 실행하기 전에 내부적으로 생성한 SQL 실행 계획
파서
에서 SQL의 문제를 확인을 함 (문법적 오류 등등)옵티마이저
모드가 RBO
인지 CBO
인지에 따라 다른 실행계획을 생성RBO
: 오라클이 만들어낸 우선순위 규칙
에 따라 실행규칙을 만듦CBO
: 비용
이 적게 드는 방법으로 실행하도록 함예상 실행계획
: SQL문
을 실행하기 전에 만든 예상 계획
explain plan for --예상계획 확인 SQL문
--ex
explain plan for
select ename, sal
from emp
where sal=1300;
--실행계획 확인
select * from table(dbms_xplan.display);
TABLE ACCESS FULL
: TABLE FULL SCAN으로 처음부터 끝까지 테이블을 다 읽었음을 뜻함
실제 실행계획
: SQL을 실행할 때
사용했던 실행계획
/*+ gather_plan_statistics */ --힌트
-- 실제 실행계획을 보여주는 힌트
--ex
select /*+ gather_plan_statistics */ ename, sal
from emp
where sal=1300;
--/* 다음 '+'를 쓰면 힌트대로 CBO가 실행해줌
--실제 실행계획 확인
select *
from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
위에서 예상 실행계획과 다른 점은 E-Rows
와 A-Rows
로 예상 행과, 실제 행을 출력해주며, A-Time
으로 수행시간을 알려준다.
Buffers
는 읽어들인 오라클 Buffer (메모리 수)를 알려준다.
힌트(Hint)
: SQL을 실행할 때 옵티마이저로 하여금 힌트 대로 실행계획
을 생성해달라고 주문
--gather_plan_statistics는 실제 실행계획을 보여달라
--full(emp)는 full table scan해라
select /*+ gather_plan_statistics full(emp) */ ename, sal
from emp
where sal=1300;
select *
from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
--sal 컬럼에 인덱스 생성
create index emp_sal on emp(sal);
--인덱스 힌트를 사용해 인덱스를 이용해서 실행
select /*+ gather_plan_statistics index(emp emp_sal) */ ename, sal
from emp
where sal=1300;
select *from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
Id
옆에 *
이 filter
이 되었다는 뜻
INDEX
를 통해서 테이블을 스캔하고 있다. 또한 버퍼의 개수가 많이 줄었다.