본문 바로가기

Windows Developer/Oracle

[Oracle]바인드 변수

쿼리의 일부분 예를 들어 WHERE 절의 내용만 다른 쿼리를 실행해야 하는 경우가 종종 생길 것이다. 이러한 경우에 거의 비슷한 두번의 쿼리를 실행하는 비효율성을 해소하는 방법이 바로 바인드 변수의 사용이다.
바인드 변수는 입력 내용을 넣고 SQL로부터 출력 내용을 받아내는 방법으로, " 이 부분에 들어갈 정확한 값은 이후에 알려줄테니, 일단 내가 값을 넣었을 때 어떻게 실행할 것인지에 대해서 계획만 세워둬라 "는 명령을 오라클에 내리는 것이다.


바인드 변수를 사용하지 않은 쿼리와 사용한 쿼리의 예

select * from emp where ename = 'KING';
select * from emp where ename = :bv;

두번째 쿼리가 바인드 변수를 사용한 쿼리로서, 보다 일반적이고, 재사용할 수 있는 형태이다.




(: = 는 대입(할당 변수)이고, = :는 비교(바인드 변수 -  ":"가 붙은 변수)이다.)
 

 declare
l_start number;
l_cnt number;
 begin

l_start := dbms_utility.get_time;
 for i in 1..100

 loop
 execute immediate
 'select count(*) from dual where dummy = '''||to_char(i)||''''
 into l_cnt;
 end loop;

 dbms_output.put_line('no bind'||(dbms_utility.get_time-l_start) ||'hsecs');

l_start := dbms_utility.get_time;
 for i in 1..100

 loop
 execute immediate
 'select count(*) from dual where dummy = : x'
 into l_cnt
 using to_char(i);
 end loop;

 dbms_output.put_line('binding' ||(dbms_utility.get_time-l_start) ||'hsecs');
 end;



(실행 결과)




실행 결과를 보면 바인드 변수가 2배나 빠른 속도를 보여주고 있다.

만약, 두 사람이 이와 같은 작업을 동시에 한다고 가정하면 실행 시간의 차이는 더욱 벌어질 것이다. 여기서 중요한 것은 공유 메모리가 방대한 공유 메모리 구조라는 것, 그리고 한번에 하나의 세션만이 그 내용을 변경할 수 있다는 것이다. 바인드 변수를 사용하지 않는 모든 사람들은 모두 공유 풀의 내용을 변경해야 할 것이며, 그 내용을 잠그고, 변경하고, 해지하는 과정을 거쳐야 한다. 

'Windows Developer > Oracle' 카테고리의 다른 글

[oracle]계정 생성 및 권한 부여  (0) 2011.02.18
[oracle] Import  (0) 2011.02.18
[Oracle] 리터럴 변수와 바인딩 변수  (0) 2011.02.11
[oracle] %TYPE과 %ROWTYPE  (1) 2011.02.09
[Oracle] 인덱스의 구조  (0) 2011.01.08