함수/스칼라서브쿼리/FAST DUAL 관련 질문 있습니다. 0 5 2,720

by 인생설계중 [2015.01.09 09:55:52]


안녕하세요

질문을 자주해서 정말 죄송합니다 ㅠㅠ

지식창고 찾아보고 있는데.. 각각에 대한 설명은 있는데

혹시 비교해서 정리된 자료가 있을까요..?

스칼라서브쿼리의 경우는 입력값/출력값 캐싱 기능 있고 함수의 경우는

캐싱기능이 없는 정도로 알고 있는데.

그 밖에 차이점이 없는지 궁금합니다. 파싱부하 차이라던지..

함수를 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 테이블, 이렇게 하면 되는건가요?

 

 

질문이 많아서 .. 죄송합니다.. 매번 정말 감사합니다.

by 마농 [2015.01.09 17:24:53]

함수는 복잡한 조회 과정을 미리 저장해 놓고 호출해서 쓰는거구요.
 - 개발 향상성에 좋습니다. 쉽게 가져다가 쓸 수 있죠.
 - 성능은 안좋습니다.(메인 쿼리와 별개로 실행됩니다.)
스칼라서브쿼리는
 - 함수에 비해 복잡해 보이죠. 겉으로 보기에...
 - 성능은 좋습니다.(메인 쿼리와 함께 실행되지요)
 - 캐싱 효과도 있습니다.
함수에 스칼라 서브쿼리를 입히면?
 - (Select 함수 From dual)
 - 함수 자체의 특성이 사라지는 건 아니죠.
 - 캐싱효과만 덧입히는 것 뿐


by 인생설계중 [2015.01.09 21:06:10]

마농님 !! 매번 답변 정말 감사합니다.

성능은 확실히 스칼라 서브쿼리가 좋은 거군요.

성능이 중요하고 재사용성이 적은 경우(개발하는데)는 스칼라 서브쿼리를,

재사용성이 높고 개발향상성이 필요한경우는 함수를 사용하고, select 함수 from dual 로

쓰도록 하는게 괜찮겠네요.

답변 정말 감사합니다.


by 비주류 [2015.01.09 19:59:20]

링크하신 문서에도 나와있지만 함수도 캐싱 효과를 위해 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 이내인 경우 성능을 위해 할당을 하고, 이상은 입력된 값에 맞게 가변적인 것으로 알고 있지만 관련있는 내용일지는...


by 인생설계중 [2015.01.09 21:08:59]

비주류님 답변 정말 감사합니다.

찾았던 내용중에, 시점에 따라 값 변경 된다고 하는거가 아리송했었는데

정확히 이해 됐습니다.

정말 감사합니다.


by 인생설계중 [2015.01.09 21:09:30]

두분다 답변 감사합니다. 오후 시간에 바빠서 집에와서야 확인을 했네요~

매번 감사합니다~

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입