함수호출 부하 해소방안 요약
(1) 페이지 처리 또는 부분범위처리 활용
: 부분범위처리가 가능한 상황이라면 데이터를 전송하는 맨 마지막 단게에 함수 호출이 일어나도록 함
(2) Decode 함수 또는 Case 문으로 변환
- 다량의 함수 호출을 피할 수 없을때 함수로직을 풀어서 decode 문이나 case문으로 전환하거나 조인문으로 구현할 수 있는지 확인
- 함수로직이 복잡하거나 함수를 사용해야 하는 경우, 입력되는 값의 종류에 따라 소량인 경우 함수를 그대로 둔채 스칼라 서브쿼리 캐싱 효과를 이용한다.
(3) 뷰 머지(View Merge)방지를 통한 함수 호출 최소화
함수를 풀어 조인문으로 변경하기 곤란한 경우 함수 호출 횟수를 줄이는 노력을 해야 한다.
- no_merge힌트 사용
- 뷰내에 rownum 사용
(4) 스칼라 서브쿼리의 캐싱효과를 이용한 함수 호출 최소화
- 스칼라 서브쿼리를 사용하면 오라클은 그 수행횟수를 최소화 하려고 입력값과 출력값을 내부 캐시에 저장한다.
- 서브쿼리가 수행될 때 마다 입력값을 캐시에서 찾아보고 있으면 저장된 출력값을 return
없으면 쿼리수행 후 입력값과 출력값을 캐시에 저장 - 함수를 Dual테이블을 이용해 스칼라 서브쿼리로 한번 감싸면 함수 호출횟수를 줄이는데 사용할 수 있다.
(함수입력값의 종류가 소수여서 해시충돌 가능성이 적은 경우에만 사용/ 그렇지 않을 경우 CPU낭비초래) - 해시충돌이 발생하면 Hidden Parameter 값인 "_query_execution_cache_max_size" 값을 증가시켜 개선가능(10g)
(5) Deterministic
- 10gR2에서 함수를 선언할 때 Deterministic 키워드를 넣어 주면 스칼라 서브쿼리를 덧입히지 않아도 캐싱효과가 있음
- 함수의 입력/출력값은 CGA에 캐싱/ 이 값은 데이터베이스 Call에서만 유효하여 Fetch Call이 완료되면 모두 해제됨
(CGA는 Call과 관련된 정보를 저장하기 위한 임시적인 공간이며, call이 시작될때 할당되고 call이 완료되면 해제된다. ) - 스칼라 서브쿼리의 입/출력 값은 UGA에 저장되므로 Fetch Call과 상관없이 캐싱되는 순간부터 끝까지 유지된다.
(UGA는 세션과 관련된 정보를 저장하기 위해 사용되는 곳으로, Fixed UGA와 Variable UGA로 구분되며, Fixed UGA는 세션에 대한 기본 정보
및 Variable UGA에 대한 포인터를 가지게 되며, Variable UGA는 Heap으로 구성된다. )
p.421~422 참조 - 함수안에 쿼리문장을 포함하고 있다면 그 함수는 일관성이 보장되지 않는다.
- Deterministic은 그 함수가 일관성 있는 결과를 리턴함을 선언 하는 것일 뿐 일관성이 보장되는 것이 아니다.
(6) 복잡한 함수 로직을 풀어 SQL로 구현
- 함수로 사용되는 부분을 풀어 SQL로 구현하여 처리 할 수 있다면 성능문제를 해결 할 수 있다.