Oracle PL/SQL: los paquetes tienen constantes definidas como (implícitamente) no nulas.
¿Hay algún impacto positivo o negativo (de rendimiento) si las constantes en paquetes/procedimientos/funciones de Oracle se definen como (implícitamente) not null
? Por ejemplo:
// Varchar2
C_LF_V1 constant varchar2(1) := chr(10);
C_LF_V2 constant varchar2(1) not null := chr(10);
// PLS number
C_MAX_PLS_STR_LENB_V1 constant pls_integer := 32767;
C_MAX_PLS_STR_LENB_V2 constant pls_integer not null := 32767;
C_MAX_PLS_STR_LENB_V3 constant positiven := 32767;
C_MAX_PLS_STR_LENB_V4 constant simple_integer := 32767;
// Date
C_MAX_DATE_V1 constant date := date ‘9999-12-31’
C_MAX_DATE_V2 constant date not null := date ‘9999-12-31’
// …
La documentación no es específica en absoluto para estos detalles, como suele suceder con demasiada frecuencia. Se ha verificado desde la versión 11 hasta la 19 (en caso de que realmente sea específico de la versión, sería de interés la implementación a partir de la versión 19).
Por supuesto, es posible/fácil realizar algunas pruebas, pero eso solo proporcionaría resultados específicos de la plataforma/versión/máquina, mientras que la implementación/lógica conceptual a nivel bajo es mucho más interesante, es decir:
¿Se compilará (implícitamente) not null
como se conoce que no es NULL o causará una comprobación de NULL cada vez que se acceda?
Actualización (aclaración):
– Mi pregunta se refiere a constantes que se sabe que son NOT NULL
(por lo que no se trata del manejo de NULL
).
– No me interesa afinar para obtener nanosegundos, quiero saber qué sucede realmente en el fondo; por ejemplo, para simple_integer
, el documento dice que puede hacer que los cálculos pesados sean más eficientes, lo que implica que al compilar “sabe” que tal variable nunca puede ser NULL
-> ¿entonces esta implicación también se aplica, por ejemplo, a un date
definido como NOT NULL
? – o un poco más complicado, ¿a un varchar2
? (donde se permite definir un subtipo NOT NULL
pero no tiene sentido ya que el atributo de nulabilidad se ignora)
davy.ai
Según la documentación de Oracle, no hay una mención específica del impacto en el rendimiento al definir constantes como (implícitas)
not null
. Sin embargo, generalmente se recomienda definir variables con las restricciones apropiadas NOT NULL o NULL para asegurar la integridad de los datos y la legibilidad del código.En términos de impacto en el rendimiento, es probable que sea insignificante o mínimo. El compilador de Oracle debería ser capaz de optimizar el código de tal manera que se tenga en cuenta la restricción NOT NULL y no se realice una comprobación de nulidad en cada acceso. Sin embargo, aún depende de la implementación específica y la versión de Oracle que se esté utilizando.
Vale la pena señalar que definir constantes como
not null
puede ser más relevante para tipos de datos numéricos comosimple_integer
opositiven
donde el compilador puede hacer que los cálculos pesados sean más eficientes si “sabe” que la variable nunca puede serNULL
. En el caso devarchar2
, se permite definir un subtipoNOT NULL
, pero es posible que no tenga sentido ya que el atributo de nulidad se ignora.En general, se recomienda definir constantes con las restricciones adecuadas NOT NULL o NULL por razones de integridad de datos y legibilidad, pero es probable que el impacto en el rendimiento sea mínimo.