펑션의 캐싱을 위한 dual..이용시 1 4 1,505

by 쿼리초보 [2022.07.05 18:55:00]


스칼라 펑션의 경우

캐싱을 하려면

Select a.id

         ,(select fn_get_code( a.id ) from dual ) as name

    From table

 

위와같은 형태로 듀얼로 한번 감싸주는것으로 알고 있습니다

 

한가지 궁금한것이

저렇게 했을경우 코드 값이 실제로 변경되었는데

캐싱에 의해 캐싱된 코드로 잘못 나올수도 있는건가요?

 

 

그렇다면 무조건 듀얼로 감싸는게 방법이 아닌거 같아서요

 

참고로 오라클 11g 입니다

조언 부탁드립니다 ^^

 

 

           

by 마농 [2022.07.05 21:30:33]

캐싱 기능은 해당 쿼리 내에서만 동작합니다.
하나의 쿼리가 실행되는 중간에 값이 바뀌는 것까지 걱정할 필요는 없을 듯 하네요.
코드값이 변경될 일이 자주 있지는 않겠죠.


by jkson [2022.07.06 08:59:19]

dual을 사용한 캐싱을 쓰든 안 쓰든 어차피 쿼리가 실행되는 시점 기준 데이터로 읽어오니 신경 안 쓰셔도 될 것 같네요.


by 쿼리초보 [2022.07.06 09:18:07]

두분다 댓글 감사합니다. 궁금증 해결되었어요


by 마농 [2022.07.06 14:39:09]

메인쿼리와 함수 내 쿼리는 수행 시점이 달라요.
쿼리 수행 도중에 다른 곳에서 값이 바뀌면 함수의 결과도 중간에 바뀌어 나옵니다.
서브쿼리 캐싱 기능을 이용한다면? 바뀌기 전 값이 유지 될 것입니다.
다만 패치 단위에서만 유효합니다. 패치사이즈가 10건이라면 10건까지만 유효합니다.
즉, 서브쿼리를 쓰든, 안쓰든 중간에 바뀐 값에 대한 보장은 하지 않습니다.
이건 사용자가 선택하고 감내해야 할 사항입니다.
다만, 그리 중요한 것 같지 않아서 신경 쓸 필요가 없다고 한 것이구요.
이게 중요한 사항이라고 생각한다면 선택을 해야 합니다.
1. 한결 같은 값을 원한다면? 함수 대신 조인으로 풀어야 합니다.
2. 실시간 변하는 값을 원한다면? 서브쿼리 없는 함수 사용.

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