728x90
02. User Call vs Recursive Call
- DB Call 커서 활동 상태에 따른 구분 : Parse, Execute, Fetch
- DB Call 발생 위치에 따른 구분 : User Call, Recursive Call
- SQL 트레이스 파일을 TKProf 유틸리티로 포맷팅하면 맨 아래쪽에 아래와 같은 Overall Total 통계가 나온다. 이 중 NON-RECURSIVE 통계가 User Call에 해당하며, 그 아래쪽 RECURSIVE 통계가 Recursive Call에 해당한다.
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 7 0.01 0.02 0 1 0 0
Execute 9 0.01 0.09 0 19 69 28
Fetch 4 0.00 0.00 0 16 0 28
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 20 0.03 0.11 0 36 69 56
Misses in library cache during parse: 5
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 8 0.00 0.01 0 0 0 0
Execute 41 0.04 0.07 0 0 0 0
Fetch 64 0.01 0.03 4 122 0 318
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 113 0.06 0.12 4 122 0 318
Misses in library cache during parse: 7
Misses in library cache during execute: 7
10 user SQL statements in session.
40 internal SQL statements in session.
50 SQL statements in session.
User Call
- User Call 은 OCI(Oracle Call Interface)를 통해 오라클 외부로부터 들어오는 Call을 말한다.
- Peak 시간대에 시스템 장애를 발생시키는 가장 큰 주범은 User Call 이다.
- User Call이 많이 발생되도록 개발된 애플리케이션은 결코 좋은 성능을 낼 수 없다.
- DBMS 성능과 확장성(Scalability)를 높이려면 User Call을 최소화 하려는 노력이 무엇보다 중요하며, 이를 위해 아래와 같은 기능과 기술을 적극적으로 활용해야만 한다.
- Loop 쿼리를 해소하고 집합적 사고를 통해 One-SQL로 구현
- Array Processing : Array 단위 Fetch, Bulk Insert/Update/Delete
- 부분범위처리 원리 활용
- 효과적인 화면 페이지 처리
- 사용자 정의 함수/프로시저/트리거의 적절한 활용
Recursive Call
- Recursive Call은 오라클 내부에서 발생하는 Call을 말한다.
- SQL 파싱과 최적화 과정에서 발생하는 Data Dictionary 조회, PL/SQL로 작성된 사용자 정의 함수/프로시저/트리거 내에서의 SQL 수행이 여기에 해당한다.
- Recursive Call을 최소화 하려면, 바인드변수를 적극적으로 사용해 하드파싱 횟수를 줄여야한다.
- PL/SQL로 작성한 프로그램을 이해하고 시기 적절하게 사용한다.
SELECT code,....
FROM ....
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 0 0.00 0.00 0 0 0 0
Execute 493 0.01 0.00 0 0 0 0
Fetch 493 0.03 0.02 0 3451 0 493
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 986 0.04 0.02 0 3451 0 493
Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 41 (recursive depth: 1)
- 위의 결과에 나오는 recursive depth는 PL/SQL실행시에 나오는 결과로 옆의 숫자값은 프로시져의 호출 횟수이다.
- recursive depth가 2이상이면 특정프로시져에서 또 다른 프로시져를 호출한 경우이며, 트레이스 결과는 마지막 프로시저에서 사용된 SQL에 대한 수행결과이다.
- PL/SQL은 가상머신(Virtual Machine)상에서 수행되는 인터프리터(Interpreter)언어이므로 빈번한 호출 시 컨텍스트 스위칭(Context Switching)때문에 성능이 매우 나빠진다. 성능을 위해서라면 PL/SQL에 대한 지나친 모듈화는 지양해야 한다.
- 또한, 대용량 데이터 조회시에 함수를 잘못사용하면 건건이 함수 호출이 발생되어 성능이 극도로 제한될수 있는등의 문제가 있다.
- 될수있으면 조인 또는 스칼라 서브쿼리 형태로 변환하려는 노력이 필요하다.
- 기타 자세한 함수에 대한 설명은 7절 이하 참고하세요.
- 지금까지의 내용을 간략히 요약하면 아래표와 같다.
Context Switching
- Context의 정의 : TASK가 사용하는 CPU 레지스터(CPU의 일부분으로 연산을 위한 임시저장소)들의 값
- Context Switching
- Running 상태의 TASK가 사용하던 Context를 메모리 특정 영역에 저장한 후 새로이 수행 될 TASK의 context를 TCB 또는 Stack에서 CPU의 레지스터 영역으로 복사하여 새로운 TASK 가 수행되도록 하는 작업
- 운영체제의 많은 프로세스가 작동하고 있을때 작동되고 있는 프로세스(Running Process)의 변경으로 인해 Running Process의 데이터가 저장되어 있는 레지스터가 변경됨을 "Context Switching"이라 함
728x90
반응형
'Oracle > Admin' 카테고리의 다른 글
[Oracle] Partition 실행 계획 (0) | 2024.12.30 |
---|---|
[Oracle] 병렬 처리 (1) | 2024.12.27 |
[Oracle] DBMS log 를 확인 하는 방법 정리 (1) | 2024.12.09 |
[Oracle] Index coalesce vs Index rebuild (0) | 2024.11.20 |
[Oracle] ORA-01804 : this index object is being online .. (2) | 2024.11.20 |