вторник, 3 мая 2011 г.

Подстановка текста подпрограмм (subprogram inlining) в Oracle 11g

В Oracle 11g появился новый механизм оптимизации программного кода - использование автоматической инлайн подстановки текста подпрограммы, вместо её вызова. При частых вызовах - эта штука очень хорошо позволяет экономить на накладных расходах. Надо заметить, что данный механизм работает только в случае выставления уровня оптимизации 2 и выше.

При задании второго уровня оптимизации (PLSQL_OPTIMIZE_LEVEL=2), для указания компилятору места, где необходимо осуществить подстановку используется pragma INLINE.
Синтаксис её вызова таков:

PRAGMA INLINE ( identifier , { 'YES' | 'NO' } ) ;
Применять её можно в следующих местах:
  • присваивание
  • вызов
  • условие
  • CASE
  • CONTINUE-WHEN
  • EXECUTE IMMEDIATE
  • EXIT-WHEN
  • LOOP
  • RETURN
Более подробно, но уже на английском про неё можно прочитать: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/inline_pragma.htm
В случае при использовании третьего уровня оптимизации (PLSQL_OPTIMIZE_LEVEL=3) подставлять данную pragma вручную перед каждым вызовом функции не требуется, всё будет сделано копилятором по своему усмотрению.
Чтобы увидеть собственными глазами как происходит весь этот процесс, необходимо включить уровень оптимизации 2 или 3 (ALTER SESSION SET plsql_optimize_level=2;), отображение предупреждений при компиляции (ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL';). И смотерть на предупрежения, которые будут сопровождать компиляцию.
Ниже приведу пример:

create or replace procedure INLINE_DEMO(a in number, b in number)
authid definer
is
function ADD_NUMBERS(a in number, b in number)
return number
is
begin
  return a + b;
end;
begin
for i in 1 .. 10000000
loop
  pragma inline (ADD_NUMBERS, 'YES');
  dbms_output.put_line(ADD_NUMBERS(a,b));
end loop;
end INLINE_DEMO;
PLW-06006: uncalled procedure "ADD_NUMBERS" is removed.
PLW-06005: inlining of call of procedure 'ADD_NUMBERS' was done
PLW-06004: inlining of call of procedure 'ADD_NUMBERS' requested

При компиляции с разным значением pragma будут получаться разные предупреждения, те что показаны на примере, говорят об успешной оптимизации кода.
Если не упоминать pragma, то подставнока будет выполнена автоматически, и тогда предупреждения не PLW-06004 будет. У меня автоматическая подстановка (без указания pragma) сработала и при втором уровне оптимизации, почему такое случилось, мне неизвестно, возможно из-за тривиальности примера.
Желаю всем удачной оптимизации, но не забывайте, что преждевременная оптимизация до добра не доводит.

Комментариев нет:

Отправить комментарий