본문 바로가기
Oracle/이론

<Oracle Admin 1> SQL의 실행과정(SELECT문 처리 과정) 알아보기

by HYEHYE_SON 2024. 1. 14.
728x90

Oracle DB Architecture

 

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문이 있다면, 공유풀에 있는 것

shared pool의 sql문 확인

 
 
 

반응형