DATOR


Scalar Sub-Query Cache 조정으로 Query 성능향상(부제: Function Call 호출 부하량 줄이기) SQL


Scalar subquery는 사용이 매우 편리하지만, 반복적으로 호출되어 전체 실행성능을 떨어 뜨리는 경우가 종종 발생한다.

특히 대용량 데이터에 대한 Migration SQL 작성시, 코드 변환을 Scalar subquery로 작성하곤 하는데,

예를 들어, 1억건의 데이터에 대해 Scalar subquery를 실행하는 것은, 1억건의 Function call과 맞먹는 부하를 발생시킨다.

 

이 경우, 어떻게 성능을 향상시킬 수 있을까?

입력되는 값(As-Is 코드 값)과 출력되는 값(To-Be 코드 값)을 cache에 보관하고 이 cache를 참조한다면, 매번 동일한 Scalar subquery를 실행하지 않고도 바로 처리가 가능하지 않을까?

 

ORACLE 10g 이후부터는 이 cache가 존재하고, 나아가 cache의 크기를 조절하여 성능향상이 가능하다.

hidden parameter인 _QUERY_EXECUTION_CACHE_MAX_SIZE 를 통해 session 단위로 설정가능하며,

 

ALTER SESSION SET "_QUERY_EXECUTION_CACHE_MAX_SIZE" = 8388608; -- 8 MB

 

와 같이 변경할 수 있다.

 

또한, 이 parameter는 Function Call에 대해서도 동일한 매커니즘으로 동작한다.

 

적절한 cache의 크기는 입력 값과 출력 값의 조합 수 및 크기에 따라 달라질 수 있으므로,

XPLAN 또는 Trace를 확인하여 적정 수준으로 조정이 필요하다.

 

TAG

Leave Comments


profile기술 너머의 통찰 

Recent Trackback