[실무에서 바로 쓰는 SQL 기본과 SQL 튜닝][ORACLE] 27강

MinHee·2023년 5월 20일
0
post-thumbnail

SQL의 실행계획

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

  1. PARSER : 사용자의 SQL문이 문제가 있는지를 확인

  2. OPTIMIZER

1) RULE-BASED OPTIMIZER (RBO) : 오라클의 우선 순위에 따라 실행계획 생성
2) COST-BASED OPTIMIZER (CBO) : 비용이 적게드는 방법으로 실행계획 생성 (융통성 있게) - ORACLE DEFAULT

CBO이기 때문에 SQL 튜닝이 필요함 - 그때그때 실행 성능이 달라짐

  1. ROW SOURCE GENERATOR : 플랜을 완성

  2. SQL EXECUTION : 실행 계획에 따라서 SQL문 실행

예상 실행계획

SQL문을 실행하기 전에 만든 예상 계획

SQL문 전에 'EXPLAIN PLAN FOR'을 작성하여 실행

EXPLAIN PLAN FOR
SELECT ename, sal
FROM emp
WHERE sal = 1300;

SELECT * FROM TABLE(dbms_xplan.display); -- 예상 실행계획 확인 가능

안쪽에서 바깥 순서로 읽으면 됨 - 1,0 순서

실제 실행계획

SQL문을 실행할 때 사용했던 실행계획

SELECT /+ GATHER_PLAN_STATISTICS / ENAME, SAL
FROM EMP
WHERE SAL=1300;

/+ GATHER_PLAN_STATISTICS /
/+ .... / : 힌트

SELECT *
FROM TABLE(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));

E-ROWS/A-ROWS : 예상 행 수, 실제 행 수
A-TIME : 수행 시간
BUFFERS : 수행하기 위해 읽어들인 오라클 메모리의 수 -- 수가 작을수록 성능이 좋은 SQL문

예상 실행계획과 다르게 실제 실행계획에서는 버퍼의 수를 확인할 수 있다

힌트

SQL을 실행할 때 옵티마이저로 하여금 힌트대로 실행계획을 생성해달라고 주문

SELECT /+ GATHER_PLAN_STATISTICS FULL(EMP) / ENAME, SAL
FROM EMP
WHERE SAL=1300;

FULL(EMP) : EMP 테이블을 FULL SCAN하라
GATHER_PLAN_STATISTICS : 실제 실행계획을 보여라

인덱스를 생성했을 때

CREATE INDEX emp_sal
ON emp(sal);

SELECT /+ GATHER_PLAN_STATISTICS INDEX(EMP EMP_SAL) / ENAME, SAL
FROM EMP
WHERE SAL=1300;

INDEX(EMP EMP_SAL) : EMP_SAL이란 인덱스를 타서 EMP 테이블을 스캔하여라

버퍼의 개수가 2개로 줄었음

조건에서 사용되는 칼럼에 인덱스를 생성한 후 실행하면, 성능이 좋아진다 (사용되는 버퍼의 수가 줄어든다)

인덱스

쿼리문의 검색 속도를 높이는 DB OBJECT

인덱스는 컬럼값과 ROWID로 이루어져있고, 컬럼값은 ASCENDING하게 정렬되어 있음

숫자형 칼럼에 걸린 인덱스에 대한 인덱스 테이블을 출력

SELECT SAL, ROWID
FROM EMP; -- 테이블에서 값을 읽어옴

SELECT SAL, ROWID
FROM EMP
WHERE SAL >= 0; -- 인덱스 테이블을 출력함

문자형 칼럼에 걸린 인덱스에 대한 인덱스 테이블을 출력

SELECT ENAME, ROWID
FROM EMP
WHERE ENAME > ' '; -- 인덱스 테이블 출력

실제 실행 계획을 출력해보면, 인덱스 테이블에서만 읽어왔다는 걸 알 수 있음

문자형 칼럼에 걸린 인덱스에 대한 인덱스 테이블을 출력

SELECT HIREDATE, ROWID
FROM EMP
WHERE HIREDATE < TO_DATE('9999/12/31','RRRR/MM/DD');

profile
성장하는 개발자

0개의 댓글