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


  • Recursive Call{}은 오라클 내부에서 발생하는 Call
  • SQL 파싱과 최적화 과정에서 발생하는 Data Dictionary 조회, PL/SQL로 작성된 사용자 정의 함수/프로시저/트리거 내에서의 SQL 수행이 여기에 해당.
  • Recursive Call을 최소화하려면,
  1. 바인드 변수를 적극적으로 사용해 하드파싱 발생횟수를 줄여야 한다.
  2. PL/SQL로 작성한 프로그램이 어떤 특징을 가지며 내부적으로 어떻게 수행되는지를 잘 이해하고 시의 적절하게 사용해야만 한다. PL/SQL은 가상머신(Virtual Machine)상에서 수행되는 인터프리터(Interpreter)언어이므로 빈번한 호출 시 컨텍스트 스위칭(Context Switching)때문에 성능이 매우 나빠진다 (7절에서 설명)
  3. 대용량 데이터를 조회할 때는 함수를 부분범위처리가 가능한 상황에서 제한적으로 사용해야 하며, 될 수 있으면 조인 또는 스칼라 서브쿼리 형태로 변환하려는 노력이 필요하다.



문서에 대하여