Производительность PL/SQL - Время компиляции
ОГЛАВЛЕНИЕ
Страница 5 из 7
Время компиляции
Конечно, этот процесс оптимизации затрудняет работу компилятора. Но насколько?
Чтобы ответить на этот вопрос, я взял код реального приложения, показанный ранее, и скомпилировал его в различных комбинациях с inlining/без inlining и interpreted/native. Вот время компиляции:
| Inlined | Not inlined |
Interpreted | 1.70 | 1.64 |
Native | 3.15 | 2.81 |
Результаты говорят сами за себя. При компиляции с использованием inline, время компиляции выше совсем чуть-чуть (около 4%) в режиме interpreted. В режиме native, оно вышеl,но и разница больше — около 12%. Таким образом, целесообразно компилировать приложение в режиме inline/interpreted во время разработки, а затем в режиме native на стадии окончания. Использование inlining добавляет время компиляции несущественно, поэтому при разработке это время ни на что не влияет.
Теперь мы подошли к важному вопросу: Раз код не менялся, как можно подтвердить, что код был подменён? Это можно сделать с помощью переменной сессии:
alter session set plsql_warnings = 'enable:all';Теперь, после пересоздания процедуры:
SQL> @upd_intОбратите внимание на последнюю строку, которая подтверждает, что процедура calc_int была подменена.
SP2-0804: Procedure created with compilation warnings
SQL> show errorЕсли вы хотите найти объекты, которые были скомпилированы с этим уровнем, можно выполнить запрос к представлению USER_PLSQL_OBJECT_SETTINGS:
Errors for PROCEDURE UPD_INT:
LINE/COL ERROR
-------- -----------------------------------------------------------------
7/5 PLW-06006: uncalled procedure "CALC_INT" is removed.
28/13 PLW-06005: inlining of call of procedure 'CALC_INT' was done
sql> select name, plsql_optimize_levelЕсть и похожее представление для всех объектов: DBA_PLSQL_OBJECT_SETTINGS.
2> from user_plsql_object_settings;
NAME PLSQL_OPTIMIZE_LEVEL
-------------------- --------------------
DO_CALC 2
PERFECT_TRIANGLES 2
TR_BOOKINGS_TRACK 2
TR_SALGRADE_COMP 2
UPD_INT 3
... и так далее ...
Помните, intra-unit inlining означает, что подменяются только те процедуры, которые расположены внутри блока. Внешние подпрограммы не подменяются.