02. User Call vs. Recursive Call
- Call이 어디서 발생하느냐에 따라 User Call과 Recursive Call로 나눌 수 있다.
- SQL 트레이스 파일의 TKProf 유틸로 포멧팅하면 맨 아래쪽에 Overall Total 통계중 NON-RECURSIVE 통계가 User Call, RECURSIVE 통계가 Recursive Call에 해당.
- User Call{}은 OCI(Oracle Call Interface)를 통해 오라클 외부로부터 들어오는 Call.
- Peak 시간대에 시스템 장애를 발생시키는 가장 큰 주범은 User Call.
- DBMS 성능과 확장성(Scalability)을 높이려면 User Call을 최소화하려는 노력이 중요
- Loop 쿼리를 해소하고 집합적 사고를 통해 One-SQL로 구현
- Array Processing : Array 단위 Fetch, Bulk Insert/Update/Delete
- 부분범위처리 원리 활용
- 효과적인 화면 페이지 처리
- 사용자 정의 함수/프로시저/트리거의 적절한 활용
- Recursive Call{}은 오라클 내부에서 발생하는 Call
- SQL 파싱과 최적화 과정에서 발생하는 Data Dictionary 조회, PL/SQL로 작성된 사용자 정의 함수/프로시저/트리거 내에서의 SQL 수행이 여기에 해당.
- Recursive Call을 최소화하려면,
- 바인드 변수를 적극적으로 사용해 하드파싱 발생횟수를 줄여야 한다.
- PL/SQL로 작성한 프로그램이 어떤 특징을 가지며 내부적으로 어떻게 수행되는지를 잘 이해하고 시의 적절하게 사용해야만 한다. PL/SQL은 가상머신(Virtual Machine)상에서 수행되는 인터프리터(Interpreter)언어이므로 빈번한 호출 시 컨텍스트 스위칭(Context Switching)때문에 성능이 매우 나빠진다 (7절에서 설명)
- 대용량 데이터를 조회할 때는 함수를 부분범위처리가 가능한 상황에서 제한적으로 사용해야 하며, 될 수 있으면 조인 또는 스칼라 서브쿼리 형태로 변환하려는 노력이 필요하다.
문서에 대하여
- 최초작성자 : 김종원
- 최초작성일 : 2010년 01월 09일
- 이 문서는 오라클클럽 코어 오라클 데이터베이스 스터디 모임에서 작성하였습니다.
- {*}이 문서의 내용은 (주)비투엔컬설팅에서 출간한 '오라클 성능 고도화 원리와 해법I'를 참고하였습니다.*