Производительность PL/SQL - Новый тип данных: Simple_Integer
ОГЛАВЛЕНИЕ
Новый тип данных: Simple_Integer
Достоинства Native compilation ещё больше очевидны при использовании нового типа данных, simple_integer. Технически это не настоящий тип данных, а скорее подтип pls_integer. Этот подтип создан для улучшения машинных вычислений по сравнению с программными вычислениями. Когда simple_integer используется одновременно с Native compilation, производительность будет намного лучше. В эксперименте, который будет показан дальше, вы увидите, почему.
Так как simple_integer является подтипом pls_integer, он наследует его свойства как 32-битного целого числа со знаком и может быть целым числом от - 2,147,483,648 до 2,147,483,647. Однако он отличается от pls_integer следующим: он не допускает значения null, но допускает переполнение — когда значение превышает максимум, оно сбрасывается, а ошибка не появляется.
Этот тип данных можно синтаксически использовать во всех тех же местах, где и pls_integer, но необходимо внимательно следить за разницей; дополнительные свойства simple_integer в некоторых случаях могут оказаться неуместными.
Давайте проверим несколько потенциальных задач, где следовало бы заменить pls_integer на simple_integer:
- Эта переменная не может быть null, поэтому если не написать так, как показано ниже:
num1 simple_integer:= 1;
а написать так:num1 simple_integer;
то будет получена ошибка компиляции:PLS-00218: a variable declared NOT NULL must have an initialization assignment
Если установить значение переменной в NULL внутри программы, например, так:
num1 := NULL;
будет получена ошибка компиляции:
PLS-00382: expression is of wrong type
Избегайте этих сообщений об ошибках, которые могут быть не видны с точки зрения точной сути ошибки. Если программа ожидает установки переменной в null, то не следует описывать переменную, как simple_integer.
- Другой важный момент в применении simple_integer заключается в том, что используется сброс значений при достижении максимальной и минимальной границ. Помните, максимальное положительное значение pls_integer, это 2147483647. Что случится, если попытаться сохранить значение, которое больше? Посмотрите демонстрационный пример:
declare v1 pls_integer := 2147483647;
Будет получена ошибка:
begin
v1 := v1 + 1;
dbms_output.put_line('v1='||v1);
end;
/declare
Ошибка очевидна и вполне уместна; вы попытались превысить максимальное значение, допустимое для типа данных. Если вместо pls_integer использовать simple_integer:
*
ERROR at line 1:
ORA-01426: numeric overflow
ORA-06512: at line 4declare v1
Результат будет следующим:
simple_integer := 2147483647;
begin
v1 := v1 + 1;
dbms_output.put_line('v1='||v1);
end;
/v1=-2147483648
Заметьте, что значение (-2147483648), это минимальное значение simple_integer. Когда вы прибавляете к максимальному значению (2147483647), значение просто сбрасывается до минимального — это особенность simple_integer. Помните об этом поведении.