본문 바로가기
Programming/ETC

[ORACLE] SQL문 처리 과정

by IN.0 2022. 1. 18.
728x90
반응형

parse -> bind -> execute -> fetch

SQL문이 사용자 프로세스에서 실행되었을 때 결과값을 리턴하기 까지의 과정

 

1. 서버프로세스(PGA-program global area)로 전달됨

 

2. parse 과정

2-1. syntax 확인

2-2. shared pool에 같은 SQL이 있는지 확인 (있을경우 parse 멈추고 다음 과정으로 넘어감)

----여기서 멈추고 다음 과정 넘어가면 soft parse, 계속 진행하면 hard parse----

2-3. 테이블, 칼럼 등에 대한 validation 체크, 권한 체크

2-4. 옵티마이저(어느방법으로 처리하는게 빠를지 결정하는 네비게이션 역할)로 실행계획 결정

2-5. shared pool에 SQL문+parse tree(=p-code=컴파일코드 같은 것)+실행계획 저장

* 2-2를 확인하는 방법?

- SQL문을 아스키코드로 변환 후, 합계가 같은 후보군들의 알파벳을 비교해가며 찾는다.

- 따라서 대소문자가 다르거나 띄어쓰기, 라인 수가 다르면 hard parse 하게 된다. => 자원낭비

* shared pool?

- 인스턴스(서버RAM) > SGA(system global area) > shared pool

- LRU 알고리즘으로 돌아간다. (용량이 꽉 차면 가장 오랫동안 사용하지 않은 순서대로 삭제)

- library cache(SQL문 등 저장) / data dictionary cache(테이블 이름 등 저장) / result cache(쿼리 결과 등 저장) 로 이루어짐

 

3. bind 과정 (SQL문에 변수가 있을 경우에만 실행)

- SELECT ~~~ WHERE no =:NO 와 같이 변수를 포함한 경우  p-code 해당 변수에 값을 지정함 

 

4. execute 과정

- 실행계획 (execution plan)을 적용

SELECT문
- data files에서 필요한 자료가 있는 block을 data buffer cache로 복사 (physical read)
- data buffer cache에 이미 자료가 있을 경우는 logical read라 한다.

UPDATE문
1. SELECT문처럼 실행
2. undo block을 data buffer cache로 read
3. 변경할 row에 lock 설정
4. redo(log) buffer에 작업 내용 기록 (no logging 옵션으로 생략 가능)
5. 변경 전 컬럼값 undo block에 저장
6. data block 자료 변경

* block 하나가 8kb이며, read를 최소화하는 것이 SQL 튜닝의 핵심이라 볼 수 있다.

* data buffer cache도 LRU 알고리즘으로 돌아간다.

 

5. fetch 과정 (SELECT문에서만 실행)

- 정렬해서 사용자에게 결과를 보여주는 단계

 

728x90
반응형

댓글