Cursor Life Cycle
모든 SQL(Select, Update, Delete)은 Cursor를 생성하여 실행됩니다. Pro*C 와 같은 툴을 사용하면 Cursor 의 각 단계를 프로그램에서 제어할 수 있고, 그렇지 않고 SQL*Plus 와 같은 툴을 사용할 경우에는 Implicit Cursor 가 내부적으로 생성되어, 결과만 보여지게 됩니다.
- Create Cursor
- Parse the statement
- Describe Query Result
- Define Query Output
- Bind Variables
- Parallelise the statement
- execute the statement
- Fetch rows of a query
- Close the cursor
SQL 처리의 3단계
- Parse -> Execute -> Fetch
Parse
- Syntax Check
- Object Resolution & Privilege Check (Dictionary 참조, Recursive SQL)
- Shared Pool(Shared SQL Area)에서 동일한 SQL 문장이 있는지 검색
- Determine Optimal Execution Plan (by Optimizer)
- Parsed Tree 생성하고 Shared SQL Area 에 저장
< Shared SQL Area 에 저장되는 내용 >
_ SQL Text
_ Explain Plan
_ Parsed Tree
Execute
- 생성된 Parsed Tree 를 적용하여 실제 DATA 에 대한 I/O를 수행
Fetch
- SELECT 문일 경우에 행을 가져오는 과정
- 일반적으로 Array Fetch 가 사용됨 (사용방법은 Client Tool에 따라 다름)
SQL*Plus 의 경우 Array Size(Default 15) 는 다음과 같이 확인하고 변경할 수 있다.
SQL> show arraysize
arraysize 15
SQL> set arraysize 20
SQL> show arraysize
arraysize 20
Cursor(SQL) 공유
- 동일한 SQL 일 경우 Shared SQL 에 있는 Explain Plan / Parsed Tree 을 가지고 실행하게 되어 Parse Time 이 필요없게 되고, 메모리(Shared SQL)를 절약할 수 있음
- 동일한 SQL 이란?
_ SQL Text 가 동일해야 함(대소문자 구별, Space/Tab 문자, 주석 까지 같아야 함)
_ 실제 참조되는 Object 가 동일해야 함
_ Bind Variable’s Data Type 이 동일해야 함
- Parse 의 첫단계에서 동일한 SQL 문이 Shared SQL Area 에 존재하는지 Check 하는 과정
'DB - ORACLE > DB Tunning(TABLE,SQL,...)' 카테고리의 다른 글
정규화 ( Normalization ) (0) | 2015.09.07 |
---|---|
Oracle LOCK의 유형 (0) | 2015.09.07 |
오라클 프로세스가 Free Buffer 를 찾는 과정 (0) | 2015.09.03 |
바인드 변수 Peeking ( 몰래 엿보기 ) (0) | 2015.09.03 |
Statspack을 통한 시스템 튜닝 (0) | 2015.09.02 |