안녕하세요
질문을 자주해서 정말 죄송합니다 ㅠㅠ
지식창고 찾아보고 있는데.. 각각에 대한 설명은 있는데
혹시 비교해서 정리된 자료가 있을까요..?
스칼라서브쿼리의 경우는 입력값/출력값 캐싱 기능 있고 함수의 경우는
캐싱기능이 없는 정도로 알고 있는데.
그 밖에 차이점이 없는지 궁금합니다. 파싱부하 차이라던지..
함수를 select 함수 from dual 형식으로 구현하면 함수자체를 스칼라 서브쿼리로
풀어서 한것과 차이가 없는 지도 궁금하네요...
아래 두자료 참고하고 있습니다.
http://wiki.gurubee.net/pages/viewpage.action?pageId=26741744
http://wiki.gurubee.net/pages/viewpage.action?pageId=26743016
혹시 그밖에 차이점 위주로 정리된 자료가 있을가요..?
(검색을 해봣는데.. 각각 을 설명하고.. 차이점은 캐싱여부 정도인거 같아서 여쭈어봅니다.)
추가 질문)
http://wiki.gurubee.net/pages/viewpage.action?pageId=26741744 내용입니다
_query_execution_cache_max_size=4194304
: SQL 수행 시 select list clause에서 function call 과다에 의한 성능부하가 심할 경우가 많이 있다. 그런 경우에는 function call 부분을 스칼라서브쿼리로 변경하여 function call에 의한 부하를 최소화 할 필요가 있다. 이런 경우 스칼라 서브쿼리를 위한 buffer cache 영역을 늘려주어야 하며, _query_execution_cache_max_size 로 메모리 사이즈를 늘려주어야 한다.
일반적으로 OLTP �경에서는 4M 정도가 적당하며 Function Call을 스칼라 서브쿼리로 변경할 경우 스칼라 서브쿼리 buffer cache 변경 외에 또 다른 주의할 사항이 있는데, Function Call에 의해 데이터 를 리턴 받을 때 옵티마이저는 리턴 받는 데이터를 위하여 varchar2(4000) 만큼 Memory 영역을 점유하게 되므로, substr()로 적정하게 사이즈를 두어 비효율적으로 옵티마이저가 메모리를 점유하지 않게 하여야 한다.
빨간색 부분 예를 볼수 있을까요.. varchar2(4000) 이라면.. 어차피.. 데이터가 길이가 작으면
substr 하지 않아도 해당영역이 줄어들게 되는거 아닌가 싶어서요..
단순히 SELECT (SELECT SUBSTR(함수) FROM DUAL) FROM 테이블, 이렇게 하면 되는건가요?
질문이 많아서 .. 죄송합니다.. 매번 정말 감사합니다.
링크하신 문서에도 나와있지만 함수도 캐싱 효과를 위해 deterministic(10g, 입력->출력 불변)으로 또는 result cache(11g)를 사용하도록 정의할 수 있습니다.
(non-deterministic) function 과 (순수?) scalar subquery 의 차이점중 하나로 read consistency 가 있을 것 같습니다.
main query 에 scalar subquery 사용시 main query 실행 시점을 기준으로 값을 가져오지만, (일관적)
function 사용시, 처리중 function 이 호출되는 시점에 따라 값이 변경될 수 있습니다. (실행중 다른 세션에서 값 변경후 commit)
말씀하신 hidden parameter 내용은 잘 모르겠네요. PL/SQL varchar2 는 2000 byte 이내인 경우 성능을 위해 할당을 하고, 이상은 입력된 값에 맞게 가변적인 것으로 알고 있지만 관련있는 내용일지는...