데이터베이스 Call

Kyojun Jin·2022년 10월 6일
0

SQLP

목록 보기
11/34

프라이빗 SQL 영역

프라이빗 SQL 영역은 파싱된 SQL문과 세션별 정보들을 가지고 있다.
서버 프로세스가 SQL이나 PL/SQL 코드를 실행하면
바인드 변수와 쿼리 실행 상태정보, 파싱된 SQL문,
쿼리 실행 work area 등 처리에 필요한 정보들은 여기에 저장된다.
그리고 여기에 접근하기 위한 핸들을 커서라고 한다.

커서와 프라이빗 SQL은 (SQL을 실행하는 프로세스의) PGA 내부에 있다.

콜 종류

Parse Call

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

Execute Call 은 SQL실행을 요청하는 Call이다.

Fetch Call

select 문에서 실제 레코드를 읽어 사용자가 요구한 결과집합을 반환한다.

데이터베이스는 결과 집합의 행을 하나 혹은 여러개씩 fetch 할 수 있다.
fetch 과정에선 데이터베이스는 행을 선택하고, 만일 쿼리에서 요청했다면 정렬한다.
마지막 행이 fetch 될 때까지 결과의 다른 행을 연속해서 얻는다.

쿼리의 결과 집합을 전송할 때,
전체 데이터를 보내는 게 아니라 사용자가 Fetch Call 을 보낼 때마다
일정량(ArraySize)씩 나누어서 전송한다.
이를 부분범위처리라고 한다.

전체 결과집합을 버퍼캐시에 모두 적재해놓고 그때그때 전달하는 게 아니라
fetch call이 올 때가 되서야 결과집합을 생성하는데,
때문에 결과집합이 많을 수록 (출력대상이 많을 수록) 빨라지는 효과가 있다.

User Call vs. Recursive Call

User Call

User Call은 OCI(Oracle Call Interface)를 통해
오라클 외부로부터 들어오는 Call을 말한다.

DB의 성능을 높이려면 User Call을 최소화해야 한다.

  1. Loop 쿼리를 해소하고 집합적 사고를 통해 One-SQL로 구현
  2. Array Processing: Array 단위 Fetch, Bulk Insert/Update/Delete
  3. 부분범위처리 원리 활용
  4. 효과적인 화면 페이지 처리
  5. 사용자 정의 함수/프로시저/트리거의 적절한 활용

Recursive Call

오라클 내부에서 발생하는 Call을 말한다.
SQL 파싱과 최적화 과정에서 발생하는 데이터 딕셔너리 조회,
사용자 정의 함수/프로시저 내에서의 SQL 수행이 여기에 해당한다.

Recursive Call을 최소화하려면 바인드 변수를 적극적으로 사용해 하드파싱 발생횟수를 줄여야 한다.

요약

0개의 댓글