프라이빗 SQL 영역은 파싱된 SQL문과 세션별 정보들을 가지고 있다.
서버 프로세스가 SQL이나 PL/SQL 코드를 실행하면
바인드 변수와 쿼리 실행 상태정보, 파싱된 SQL문,
쿼리 실행 work area 등 처리에 필요한 정보들은 여기에 저장된다.
그리고 여기에 접근하기 위한 핸들을 커서라고 한다.
커서와 프라이빗 SQL은 (SQL을 실행하는 프로세스의) PGA 내부에 있다.
Parse Call은 SQL 파싱을 요청하는 Call이다.
When an application issues a SQL statement, the application makes a parse call to the database to prepare the statement for execution. The parse call opens or creates a cursor, which is a handle for the session-specific private SQL area that holds a parsed SQL statement and other processing information. The cursor and private SQL area are in the PGA.
어플리케이션이 SQL문을 요청한다는 건,
데이터베이스에게 해당 문을 실행할 준비를 하라는
'parse call'을 날리는 것이다.
parse call 은 커서를 열거나 생성하고,
이 커서를 통해 프라이빗 SQL 영역에 접근해서
파싱 작업에 필요한 정보들을 확인할 수 있다.
Execute Call 은 SQL실행을 요청하는 Call이다.
select
문에서 실제 레코드를 읽어 사용자가 요구한 결과집합을 반환한다.
데이터베이스는 결과 집합의 행을 하나 혹은 여러개씩 fetch 할 수 있다.
fetch 과정에선 데이터베이스는 행을 선택하고, 만일 쿼리에서 요청했다면 정렬한다.
마지막 행이 fetch 될 때까지 결과의 다른 행을 연속해서 얻는다.
쿼리의 결과 집합을 전송할 때,
전체 데이터를 보내는 게 아니라 사용자가 Fetch Call 을 보낼 때마다
일정량(ArraySize)씩 나누어서 전송한다.
이를 부분범위처리라고 한다.
전체 결과집합을 버퍼캐시에 모두 적재해놓고 그때그때 전달하는 게 아니라
fetch call이 올 때가 되서야 결과집합을 생성하는데,
때문에 결과집합이 많을 수록 (출력대상이 많을 수록) 빨라지는 효과가 있다.
User Call은 OCI(Oracle Call Interface)를 통해
오라클 외부로부터 들어오는 Call을 말한다.
DB의 성능을 높이려면 User Call을 최소화해야 한다.
오라클 내부에서 발생하는 Call을 말한다.
SQL 파싱과 최적화 과정에서 발생하는 데이터 딕셔너리 조회,
사용자 정의 함수/프로시저 내에서의 SQL 수행이 여기에 해당한다.
Recursive Call을 최소화하려면 바인드 변수를 적극적으로 사용해 하드파싱 발생횟수를 줄여야 한다.