SQL 실행계획

.·2024년 4월 14일
0

ORACLE

목록 보기
4/8

1. SQL의 실행계획

  • SQL문 실행 전 내부적으로 생성한 SQL 실행 계획
  • 순서
  1. 사용자) SQL 요청
  2. Parser) SQL 문법 검사
  3. Row Source Generator) Optimizer Mode에 따른 실행계획 생성
  4. SQL 실행

2. Optimizer Mode

  • Rule-Based Optimizer
    정해진 우선순위 법칙 따라 실행계획을 만듦
  • Cost-Based Optimizer
    상황에 따라 가장 비용이 적게 드는 실행계획을 선택
    오라클의 기본값

3. 예상 실행계획

  • SQL문을 실행하기 전에 만든 예상 계획
EXPLAIN PLAN FOR
	SELECT *
    FROM EMP
    WHERE EMPNO = 7839;
    
SELECT * 
FROM TABLE(DBMS_XPLAN.DISPLAY);

4. 실제 실행계획

  • SQL 실행 시 실제 사용한 실행계획
SELECT /*+ GATHER_PLAN_STATISTICS */ *
FROM EMP
WHERE EMPNO = 7839;

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));

  • E-ROWS: 예상된 ROW 건수
  • A-ROWS: 실제 ROW 건수
  • A-TIME: 실제 수행된 시간
  • BUFFERS: SQL을 수행하기 위해 읽어들인 오라클 버퍼(메모리) 수. 값이 적을수록 성능이 좋음

5. 힌트 (hint)

  • SQL 실행 시 옵티마이저로 하여금 실행계획을 제어하기 위한 지시구문

테이블명 그대로 사용

SELECT /*+ GATHER_PLAN_STATISTICS FULL(EMP) */ *
FROM EMP
WHERE EMPNO = 7839;

테이블 별칭 사용

SELECT /*+ GATHER_PLAN_STATISTICS FULL(E) */ *
FROM EMP E
WHERE EMPNO = 7839;
  • GATHER_PLAN_STATISTICS: SQL의 실제 실행계획을 모아서 보여달라
  • FULL(EMP): EMP 테이블을 FULL SCAN 하라
  • INDEX(EMP EMP_ENAME) EMP 테이블을 EMP_ENAME 인덱스명으로 INDEX SCAN 하라

6. 인덱스

  • 쿼리문의 검색속도를 높이는 DB Object
// CEREATE INDEX 인덱스명 ON 테이블(컬럼)
CREATE INDEX EMP_EMPNO ON EMP(EMPNO);

SELECT /*+ GATHER_PLAN_STATISTICS INDEX(EMP EMP_EMPNO) */ *
FROM EMP
WHERE EMPNO = 7839;

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));

인덱스 생성 전


1) 테이블 전체를 스캔 후
2) SELECT 실행

인덱스 생성 후


1) EMP_EMPNO 인덱스를 타고
2) 그 인덱스의 ROWID로 테이블 액세스
3) SELECT 실행




[이지업클래스] 실무에서 바로 쓰는 SQL 튜닝법 수강 후 정리한 내용입니다.

0개의 댓글