Производительность 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 
    *
    ERROR at line 1:
    ORA-01426: numeric overflow
    ORA-06512: at line 4
    Ошибка очевидна и вполне уместна; вы попытались превысить максимальное значение, допустимое для типа данных. Если вместо pls_integer использовать simple_integer:
    declare v1 
    simple_integer := 2147483647;
    begin
    v1 := v1 + 1;
    dbms_output.put_line('v1='||v1);
    end;
    /
    Результат будет следующим:
    v1=-2147483648 
    Заметьте, что значение (-2147483648), это минимальное значение simple_integer. Когда вы прибавляете к максимальному значению (2147483647), значение просто сбрасывается до минимального — это особенность simple_integer. Помните об этом поведении.