함수 안의 바인딩 0 0 2,138

by 지호준 healblue [2008.04.29 15:40:07]


다음과 같은 구문을 실행합니다.
declare

    ls_ename varchar2(10);


    begin
    for i in (select to_char(deptno) deptno from dept) loop
        for j in (select * from emp where deptno = to_number(i.deptno)) loop
            ls_name := j.ename;
        end loop;
    end loop;
end;

여기서 주목해서 보셔야 할 점은 두번째 for 안에 들어있는 암시적 커서입니다. 위의 pl/sql을 트레이스를 떠보면 다음과 같은 점을 볼 수 있습니다.
PARSING IN CURSOR #4 len=48 dep=1 uid=36 oct=3 lid=36 tim=9404653521 hv=1733623145 ad=’20ad35ac’
SELECT * FROM EMP WHERE DEPTNO = TO_NUMBER(:B1 ) => 한번만 파싱 되며 요청되는 값은 바인딩변수
END OF STMT
PARSE #4:c=0,e=73,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=9404653517
BINDS #4:
kkscoacd
 Bind#0
  oacdty=01 mxl=32(02) mxlc=00 mal=00 scl=00 pre=00
  oacflg=03 fl2=1206001 frm=01 csi=873 siz=32 off=0
  kxsbbbfp=046b6988  bln=32  avl=02  flg=05
  value="10"  => 필요한 변수만 바인딩이 되는 것을 알수가 있습니다.
EXEC #4:c=0,e=4258,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=9404661967
FETCH #4:c=0,e=123,p=0,cr=3,cu=0,mis=0,r=3,dep=1,og=1,tim=9404662556
BINDS #4:
kkscoacd
 Bind#0
  oacdty=01 mxl=32(02) mxlc=00 mal=00 scl=00 pre=00
  oacflg=03 fl2=1206001 frm=01 csi=873 siz=32 off=0
  kxsbbbfp=046b597c  bln=32  avl=02  flg=05
  value="20"

 

즉, sql 문 안에 함수가 포함되어 있다고 하더라도 한 번 parsing을 했을 경우 같은 hash value를 가지게 됩니다.

그 이후에는 sql을 날리는 환경이 변하지 않는 한, 그 실행계획을 계속 사용되어질 것입니다.

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