SQL을 하기 위해서는 SELECT문의 처리 과정
즉, SQL의 실행과정 3단계를 이해하고 있어야 한다.
지금부터 위에 첨부한 사진과 함께 간단하게 그 과정을 살펴보자
INDEX
1. SQL의 실행과정 3단계
2. 실습 : Shared Pool
(내가 지금 수행한 sql문이 공유풀에 있는지 확인하기)
SQL의 실행과정
주요 과정
: sql의 실행과정 3단계
주요 과정 : sql의 실행과정 3단계
Parsing → Execute → Fetch
상세과정
상세과정
Client → Server Process(Parsing) → Execute(Buffer Cache) → Fetch(Server Process → Client)
상세과정 설명
# PARSHING
1. Client(User Process)
SQL문을 작성해서 server process에게 보냄
select ename
from emp
where sal > 3000;
2. Server Process
Client가 보낸 sql문을 Parsing(구문분석, 의미확인, 권한확인) 하고,
수행한 sql문장과 파싱 된 결과인 parse tree를 shared pool에 load 한다.
● 파싱 결과물은 총 3가지이다.
- SQL 문장
- 실행계획
- Parse tree(실행 가능한 코드, 파싱결과 sql)
이 3가지 파싱 결과물을 Shared Pool Memory 의 library cache에 load 한다.
(즉, Shared Pool Memory에 load 하는 것은 3가지 : 수행한 sql문장, parse tree, 실행계획)
■ Parshing이란?
아래의 3가지 작업을 수행하는 것을 말한다.
--------------------------------
- 구문분석 : SQL문법의 오류가 없는지 검사
- 의미확인 : 받은 SQL문의 테이블이 DB에 존재하는 테이블인지 확인
(예문에서는 emp테이블이 DB에 존재하는 테이블인지 확인하는 것)
- 권한확인 : 받은 SQL문의 테이블을 select 할 수 있는 권한이 있는지 확인
(예문에서는 emp테이블을 select 할 수 있는 권한이 있는지 확인하는 것)
--------------------------------
■ SOFT PARSE vs HARD PARSE
- SOFT PARSE : 파싱과정이 생략되는 것
실행할 SQL과 똑같은 SQL이 공유풀(shared pool)에 있으면,
PARSING과정을 생략하고 바로 실행하는 것을 의미한다.
- HARD PASE
실행할 SQL과 똑같은 SQL이 공유풀에 없으면,
PARSING을 진행한 후 공유풀(shared pool)에 올려놓는 것을 의미한다.
- Shared Pool에 load 하는 이유?
Parsing은 cpu를 많이 사용하기 때문에
다음에 똑같은 sql을 실행할 경우 parsing 과정을 생략하기 위함
■ 똑같은 SQL이 되기 위한 기준?
1. 대소문자 구분 : 따라서 대문자, 소문자 중 하나로 통일해서 사용하는 게 좋다.
2. 공백, 들여 쓰기 구분
3. 리터럴(literal) sql을 구분 : 바인드 변수를 사용하는 게 좋다.
# EXECUTE
3-1. BUFFER CACHE
검색하고자 하는 데이터를 buffer cache에서 우선 탐색 후
원하는 데이터가 없을 경우 data file에서 찾아 복사본을 buffer cache에 load
3-2. EXCUTE
검색하고자 하는 데이터를 DB에서 찾는 과정을 의미한다.
이때 옵티마이저가 생성해준 실행계획으로 실행한다.
오라클 메모리에 있는 buffer cache에서 먼저 data를 탐색하고,
없을 경우 data file에서 찾아
해당 data의 복사본을 buffer cache에 올려놓는 것.
- BUFFER CACHE에 올려놓는 이유?
다음번에 이 데이터를 요청했을 때, 메모리에서 바로 찾기 위함이다.
즉, 빠르게 데이터를 검색하기 위해서 결과 데이터를 메모리에 올려놓는 것.
# FETCH
4. Result Set
Buffer cache 혹은 DB에서 찾은 데이터를 Server Process가 → User Process에게 보내는 작업
실습 : Shared Pool
내가 지금 수행하는 sql문이 공유풀에 있는지 확인할 수 있다.
아래와 같이 수행해 보자
#1. 확인하고자 하는 sql을 수행
select ename
from emp
where sal > 3000;
#2. 위의 SQL이 공유풀(Shared Pool)에 있는지 확인
select sql_text
from v$sql
where sql_text like 'select ename%';
#싱글 쿼테이션 마크 내에 찾고자 하는 sql문의 일부 넣기
#3. 결과에 수행한 sql문이 있다면, 공유풀에 있는 것
'Oracle > 이론' 카테고리의 다른 글
컬럼의 alias(별칭) 왜 Order By 절에서만 사용이 가능할까? (4) | 2024.01.21 |
---|