Рассмотрим следующие утверждения
select name from T_emp where id=1;
select name from T_emp where id=2;
select name from T_emp where id=3;
Каждый раз, когда выполняется оператор, Oracle проверяет предыдущие вхождения того же запроса. Если он находит тот же запрос, он использует тот же план выполнения . Если нет, он должен найти различные пути выполнения, придумать оптимальный план выполнения и выполнить его.
В отличие от человека, он недостаточно умен, чтобы понять, что изменился только идентификатор (в соответствии с приведенным выше примером). Следовательно, он проходит всю борьбу и выполняет ее.
Но есть способ сообщить Oracle, что это аналогичное утверждение и что он может использовать тот же план выполнения - BIND VARIABLE . Пожалуйста, найдите пример ниже:
declare
v_id number;
v_name varchar2(30);
type c is ref cursor;
c1 c;
begin
for i in 1..100
loop
open c1 for 'select * from T_emp where id = :x' using i;
fetch c1 into v_name;
dbms_output.put_line('name is ' || v_name);
end loop;
END;
Использование переменных Bind помогает повысить производительность в десять раз. PL / SQL использует переменные связывания самостоятельно (вам не нужно явно указывать это)