バインド変数を使用してPL/SQLプログラムの性能を向上させる


次の2つのプログラムを考慮する
declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin
for i in 1..1000
loop
open l_rc for 
'select object_name
from all_objects
where object_id ='||i;
fetch l_rc into l_dummy;
close l_rc;
end loop;
dbms_output.put_line
(round((dbms_utility.get_time-l_start)/100, 2)||
'seconds...');
end;
/
declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin
for i in 1..1000
loop
open l_rc for 
'select object_name
from all_objects
where object_id = :x'
using i;
fetch l_rc into l_dummy;
close l_rc;
end loop;
dbms_output.put_line
(round((dbms_utility.get_time-l_start)/100, 2)||
'seconds...');
end;
/

第1セグメントのプログラムはハードコーディングを使用し、クエリが使用するwhere条件は直接iの値を使用する.第2セグメントのプログラムはバインド変数を使用し、実行中にiを入力する  の双曲線コサインを返します.
2つのプログラムの違いは、第1のセグメントがクエリのたびにクエリ文を再解析する必要があり、合計1000回解析したことである.しかし、第2のセグメントは1回のみ解析され、以降、クエリのたびに同じコードが共有プールから呼び出される.
だから第1段のプログラムは全部で3分余りかかりました.第2段のプログラムは2秒もかかりませんでした.