메뉴 건너뛰기

bysql.net

2._User_Call_vs._Recursive_Call

2012.05.07 10:01

정찬호 조회 수:4413

Call이 어디서 발생하느냐에 따라

1. User Call

2. Recursive Call


그림1

꾸미기_꾸미기_P20120507_011455512_1F757B8A-7E10-4F4C-A7B4-05B9F9075A62.JPG



그림2

꾸미기_꾸미기_P20120507_011511768_FD8A5986-A923-4AE3-BD3B-A2BDC7D158E6.JPG


1. User Call

  가. OCI(Oracle Call Interface)를 통해 Oracle 외부로부터 들어오는 Call을 말합니다.

     그림2에서 보면 DBMS 입장에서의 사용자는 WAS이기 때문에 User Call이 클라이언트가 아닌 WAS에서 발생하게 됩니다.

  나. Peak 시간대에 시스템 장애 주범은 User Call인 경우가 많습니다.

     애플리케이션의 설계와 프레임워크 기술 구조에 기인하는 경우가 많으며 Array Processing을 제대로 지원하지 않는 프레임 워크,

     화면 페이지 처리에 대해 잘못 설계된 표준가이드, 사용자 정의 함수/프로시저에 대한 무조건적인 제약 등의 경우를 예로 들수

     있습니다.

  다. User Call을 최소화하기 위해서는

     (1) Loop쿼리를 해소하고 집합적 사고를 통해 One-SQL로 구현

     (2) Array Processing : Array 단위 Fetch, Bulk Insert/Update/Delete

     (3) 부분범위처리 원리 활용

     (4) 효과적인 화면 페이지 처리

     (5) 사용자 정의 함수/프로시저/트리거의 적절한 활용


2. Recursive Call

  가. Oracle 내부에서 발생하는 Call을 말합니다.

  나. SQL파싱과 최적화 과정에서 발생하는 Data Dictionary 조회, PL/SQL로 작성된 사용자 정의 함수/프로시저/트리거

     내에서의 SQL수행이 여기에 해당합니다.

  다. Recursive Call을 최소화하기 위해서는 바인드 변수를 적극적으로 사용해 하드파싱 발생회수를 줄여야 합니다.

     그리고 PL/SQL의 시의 적절한 사용이 이루어져야 합니다.

  라. Recursive Depth의 경우 특정 프로시저를 호출했는데 거기서 또 다른 프로시저를 호출한 경우이며 그 정도가

    깊어지도록 프로그래밍하는 것은 바람직하지 않다. PL/SQL은 가상머신 상에서 수행되는 인터프리터언어이므로

    빈번한 호출 시 컨텍스트 스위칭 때문에 성능 저하현상이 발생합니다.


그림3

꾸미기_꾸미기_P20120507_011525377_A27313FC-B9AB-4176-97A1-576B6B4A1929.JPG 


  마. 대용량 데이터 조회 쿼리에서 함수를 잘못 사용하면 성능이 극도로 저하되는 경우가 발생하는데

    함수를 부분범위처리하 가능한 상황에서 제한적으로 사용해야 하며, 될 수 있으면 조인 또는 스클라 서브쿼리 형태로

    변환하려는 노력이 필요합니다.


그림4

꾸미기_꾸미기_P20120507_011546946_425B7146-D005-41EE-8865-4028D60D4E74.JPG