[Oracle] SQL의 실행

당당·2023년 12월 25일
0

Oracle

목록 보기
28/51

📔설명

SQL 실행계획, 예상 실행계획, 실제 실행계획, 실행계획 제어 힌트를 알아보자.


🧇SQL 실행계획

SQL 실행계획
: SQL을 실행하기 전에 내부적으로 생성한 SQL 실행 계획

  • 파서에서 SQL의 문제를 확인을 함 (문법적 오류 등등)
  • 문제가 없으면 실행계획을 만드는데, 옵티마이저 모드가 RBO인지 CBO인지에 따라 다른 실행계획을 생성
  • RBO : 오라클이 만들어낸 우선순위 규칙에 따라 실행규칙을 만듦
  • CBO : 비용이 적게 드는 방법으로 실행하도록 함
  • 실행계획을 확인해서 실행 엔진으로 SQL을 실행함

🍠예상 실행계획

예상 실행계획
: 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-RowsA-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를 통해서 테이블을 스캔하고 있다. 또한 버퍼의 개수가 많이 줄었다.

profile
MySQL DBA 신입

0개의 댓글