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 하는 과정