8. Компилятор PL/SQL
- PL/SQL использует новый оптимизирующий компилятор, который может переделать код для лучшей производительности.
- Производительность PL/SQL улучшена по всем направлениям.
- Большинство улучшений выполняются автоматически.
- Уровень оптимизации по умолчанию повышает производительность для широкого диапазона PL/SQL операций.
Изменения в компиляторе PL/SQL:
- Уничтожение временных операндов компилятором.
- Вычисление некоторых операций во время компиляции.
- Повторное использование значений некоторых выражений.
- Упрощение или исключение некоторых ветвей и исключение мёртвого кода.
- Избежание библиотечных вызовов путем прямого выполнения некоторых операций на виртуальной машине PL/SQL.
- Все курсоры корректно завершаются при выходе из цикла курсора или блока объявления.
- Удаление вычислений, которые, как побочный эффект, лишь вызывают исключение.
PLSQL_CODE_TYPE
. Задаёт режим компиляции (INTERPRETED
илиNATIVE
).Этот параметр задает режим компиляции для модулей PL/SQL библиотек. Если вы выберете
INTERPRETED
, модули PL/SQL библиотеки будут скомпилированы в формат байт-кода PL/SQL. Такие модули выполняются интерпретатором PL/SQL. При выбореNATIVE
библиотечные модули PL/SQL (за исключением анонимных PL/SQL блоков верхнего уровня) будут скомпилированы в машинный код. Такие модули будут выполняться изначально без дополнительных затрат на интерпретатор.При изменении значения этого параметра он не влияет на уже скомпилированные модули PL/SQL библиотеки. Значение этого параметра постоянно хранится в каждом библиотечном блоке. Если модуль PL/SQL библиотеки скомпилирован как
NATIVE
, все последующие автоматические перекомпиляции этого модуля библиотеки будут использоватьNATIVE
-компиляцию. В Oracle Database 11gNATIVE
компиляция проще и интегрированнее, с меньшим количеством параметров инициализации для установки.В редких случаях, если издержки оптимизатора заставляют компиляцию очень больших приложений занимать слишком много времени, можно снизить уровень оптимизации, установив параметр инициализации
PLSQL_OPTIMIZE_LEVEL
равным 1 вместо его значения по умолчанию 2. В более редких случаях может наблюдаться изменение в поведении исключения — либо исключение, которое не возникает вообще, либо исключение, которое возникает раньше, чем ожидалось. УстановкаPLSQL_OPTIMIZE_LEVEL
равным 0 совсем запрещает изменение кода.PLSQL_OPTIMIZE_LEVEL
. Задаёт уровень оптимизации (0
,1
,2
или3
).0
. Поддерживает порядок вычислений и, следовательно, шаблоны побочных эффектов, исключений и инициализации пакетов Oracle9i и более ранних выпусков. Так же удаляет новые семантические сущностиBINARY_INTEGER
иPLS_INTEGER
и восстанавливает предыдущие правила вычисления целочисленных выражений. Хотя код будет работать несколько быстрее, чем в Oracle9i, использование уровня 0 потеряет большую часть прироста производительности PL/SQL, начиная с Oracle Database 10g.1
. Применяет широкий диапазон оптимизаций к PL/SQL программам, включая устранение ненужных вычислений и исключений, но, как правило, не меняет первоначальный порядок исходного кода2
. Применяет широкий спектр современных методов оптимизации за пределами уровня 1, включая изменения, которые могут переместить исходный код относительно далеко от его первоначального местоположения3
. Новое значение, появившееся в Oracle Database 11g. Применяет широкий спектр методов оптимизации за пределами уровня 2, автоматически включая методы, не запрошенные специально. Это включает подстановку процедур, которая представляет собой процесс оптимизации, заменяющий вызовы процедур копией тела вызываемой процедуры. Скопированная процедура почти всегда выполняется быстрее, чем исходный вызов. Чтобы разрешить подпрограммную подстановку, примите значение по умолчанию параметра инициализацииPLSQL_OPTIMIZE_LEVEL
(которое равно 2) или задайте для него значение 3. ПриPLSQL_OPTIMIZE_LEVEL = 2
необходимо указать каждую подпрограммуINLINE
. ПриPLSQL_OPTIMIZE_LEVEL = 3
компилятор PL/SQL ищет возможности для встраивания подпрограмм за пределы места, где они были указаны вами.
PLSQL_CCFLAGS
. Управляет условной компиляцией каждого модуля PL/SQL библиотеки независимо.PLSQL_WARNINGS
. Включает или отключает создание PL/SQL компилятором отчётов о предупреждениях.
Как правило, для обеспечения максимальной производительности, используют следующий параметр:
ALTER SESSION SET PLSQL_CODE_TYPE = 'NATIVE';
ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL = 2;
Настройки PL/SQL объектов можно посмотреть в словаре USER|ALL|DBA_PLSQL_OBJECT_SETTINGS
.
SELECT Name, Type, PLSQL_Debug, PLSQL_Code_Type, PLSQL_Optimize_Level
FROM USER_PLSQL_OBJECT_SETTINGS;
NAME | TYPE | PLSQL_DEBUG | PLSQL_CODE_TYPE | PLSQL_OPTIMIZE_LEVEL |
---|---|---|---|---|
ADD_EMPLOYEE | PROCEDURE | FALSE | INTERPRETED | 2 |
ADD_JOB_HISTORY | PROCEDURE | FALSE | INTERPRETED | 2 |
CHECK_SALARY | PROCEDURE | FALSE | INTERPRETED | 2 |
... | ... | ... | ... | ... |
VALID_DEPTID | FUNCTION | FALSE | INTERPRETED | 2 |
WEB_EMPLOYEE_REPORT | PROCEDURE | FALSE | INTERPRETED | 2 |
Преимущества предупреждений компилятора:
- Делают программы более надежными и помогают избежать проблем во время выполнения.
- Выявление потенциальных проблем с производительностью.
- Определение факторов, приводящих к неопределенным результатам.
Типы предупреждений:
- Серьёзные (severe).
- Производительности (performance).
- Информационные (informational).
- Все (all).
Можно управлять отображением предупреждений:
ALTER SESSION SET plsql_warnings = 'error:severe'
, 'enable:performance'
, 'disable:informational'
, 'error:05003'; -- 05003 — код предупреждения
В SQL*Plus просмотреть ошибки можно с помощью команды SHOW ERRORS;
.
Рекомендации по использованию PLSQL_WARNINGS
:
- Настройки параметра
PLSQL_WARNINGS
хранятся с каждой компилируемой подпрограммой. - Если перекомпилировать подпрограмму с помощью одной из следующих инструкций, будут использованы текущие настройки для этого сеанса:
CREATE OR REPLACE
.ALTER ... COMPILE
.
- Если перекомпилировать подпрограмму с помощью инструкции
ALTER ... COMPILE
с разделомREUSE SETTINGS
, то будут использованы исходные установки, сохранённые с программой.
Пакет DBMS_WARNING
позволяет управлять поведением предупреждающих PL/SQL сообщений, в частности, путём чтения и изменения параметра инициализации PLSQL_WARNINGS
для управления тем, какие предупреждения подавляются, отображаются или рассматриваются как ошибки. Этот пакет предоставляет интерфейс для запроса, изменения и удаления текущих параметров системы или сеанса.