sql >> Base de Datos >  >> RDS >> Oracle

¿A quién se le ocurrió el término nodo DIANA y cómo calcularon que 6 000 000 LOC son aproximadamente 67108864 (2**26) nodos DIANA?

Según documentación de Oracle ,

PL/SQL se basa en el lenguaje de programación Ada. PL/SQL utiliza una variante de la notación atribuida intermedia descriptiva para Ada (DIANA), un lenguaje intermedio estructurado en árbol. Se define mediante una metanotación llamada Lenguaje de definición de interfaz (IDL) .DIANA es utilizado internamente por compiladores y otras herramientas.

En tiempo de compilación, el código fuente PL/SQL se traduce en código m legible por máquina. Tanto el código DIANA como el código m para un procedimiento o paquete se almacenan en la base de datos. En tiempo de ejecución, se cargan en el grupo de memoria compartida. DIANA se utiliza para compilar procedimientos dependientes; el código m simplemente se ejecuta.

Desafortunadamente, no puede estimar la cantidad de nodos DIANA a partir del tamaño analizado. Dos unidades de programa con el mismo tamaño analizado pueden requerir 1500 y 2000 nodos DIANA, respectivamente porque, por ejemplo, la segunda unidad contiene instrucciones SQL más complejas.

Preguntar a tom dice

Más información sobre los cálculos del nodo DIANA, lea este libro "Ada-Europe '93:12th Ada-Europe International Conference, "Ada Sans Frontieres", Paris, France, June 14-18, 1993. Proceedings"

La siguiente nota de soporte cubre bien este tema...

Article-ID:         <Note:62603.1>
Folder:             PLSQL
Topic:              General Information Articles
Title:              'PLS-123 Program too Large' - Size Limitations on PLSQL 
                    Packages
Document-Type:      BULLETIN
Impact:             MEDIUM
Skill-Level:        NOVICE
Server-Version:     07 to 08
Updated-Date:       13-JUN-2000 17:41:01
References:         

Resumen

Este artículo contiene información sobre las limitaciones de tamaño del paquete PL/SQL. Cuando se alcanzan los límites, recibe el siguiente error:

PLS-123 Program too large

Limitaciones de tamaño en paquetes PL/SQL

En versiones anteriores a la 8.1.3, los programas grandes generaban el error PLS-123. Esto ocurrió debido a límites genuinos en el compilador; no como resultado de un error.

Al compilar una unidad PL/SQL, el compilador crea un árbol de análisis. El tamaño máximo de la unidad aPL/SQL está determinado por el tamaño del árbol de análisis. Existe un número máximo de nodos diana en este árbol.

Hasta 7.3, podía tener 2 * * 14 (16K) nodos diana, y de 8.0 a 8.1.3, se permitían 2 * * 15 (32K) nodos diana. Con 8.1.3, este límite se relajó, por lo que ahora puede tener 2 * * 26 (es decir, 64 millones) de nodos diana en este árbol para paquetes y tipos de cuerpos.

Límites del código fuente

Si bien no existe una manera fácil de traducir los límites en términos de líneas de código fuente, hemos observado que ha habido aproximadamente de 5 a 10 nodos por línea de código fuente. Antes de 8.1.3, el compilador podía compilar limpiamente hasta unas 3000 líneas de código.

A partir de 8.1.3, el límite se relajó para cuerpos de paquetes y cuerpos de tipos que ahora pueden tener aproximadamente hasta 6 000 000 de líneas de código.

Notas:Este nuevo límite se aplica solo a cuerpos de paquetes y tipos de cuerpos. Además, ahora puede comenzar a alcanzar otros límites del compilador antes de alcanzar este límite de compilador en particular.

En términos del tamaño del código fuente, suponga que los tokens (identificadores, operadores, funciones, etc.) tienen una longitud promedio de cuatro caracteres. Entonces, el máximo sería:

   Up to 7.3:         4 * (2 * * 14)=64K
   From 8.0 to 8.1.3: 4 * (2 * * 15)=128K
   With 8.1.3:        4 * (2 * * 25)=256M

Esta es una estimación aproximada. Si su código tiene muchos espacios, identificadores largos, etc., puede terminar con un código fuente más grande que este. También puede terminar con un código fuente más pequeño que este si sus fuentes usan identificadores muy cortos, etc.

Tenga en cuenta que esto es por unidad de programa, por lo que es más probable que los cuerpos de los paquetes se encuentren con este límite.

Cómo verificar el tamaño actual de un paquete

Para verificar el tamaño de un paquete, el número relacionado más cercano que puede usar es PARSED_SIZE en la vista del diccionario de datos USER_OBJECT_SIZE. Este valor proporciona el tamaño de los bytes de DIANA almacenados en las tablas SYS.IDL_xxx$ y NO es el tamaño en el grupo compartido.

El tamaño de la porción DIANA del código PL/SQL (utilizado durante la compilación) es MUCHO mayor en el grupo compartido que en la tabla del sistema.

Por ejemplo, puede comenzar a experimentar problemas con un límite de 64 KB cuando PARSED_SIZE en USER_OBJECT_SIZE no supera los 50 KB.

Para un paquete, el tamaño analizado o el tamaño de DIANA tiene sentido solo para el objeto completo, no por separado para la especificación y el cuerpo.

Si selecciona parsed_size para un paquete, recibe tamaños de fuente y código separados para la especificación y el cuerpo, pero solo un tamaño analizado significativo para todo el objeto que se genera en la línea para la especificación del paquete. Se emite un 0 para parsed_size en la línea del cuerpo del paquete.

El siguiente ejemplo demuestra este comportamiento:

CREATE OR REPLACE PACKAGE example AS  
  PROCEDURE dummy1;  
END example;  
/  
CREATE OR REPLACE PACKAGE BODY example AS  
  PROCEDURE dummy1 IS  
  BEGIN  
    NULL;  
  END;  
END;  
/  

SQL> start t1.sql;  

Package created.  


Package body created.  

SQL> select parsed_size from user_object_size where name='EXAMPLE';  


PARSED_SIZE  
-----------  
        185  
          0  


SQL> select * from user_object_size where name='EXAMPLE';  

  .....

Oracle almacena tanto DIANA como MCODE en la base de datos. MCODE es el código real que se ejecuta, mientras que DIANA para una unidad de biblioteca X en particular contiene información que se necesita para compilar procedimientos usando la unidad de biblioteca X.

Las siguientes son varias notas:

a) DIANA está representada en IDL. La versión lineal de IDL se almacena en disco. El árbol de análisis real se construye y almacena en el grupo compartido. Esta es la razón por la que el tamaño de DIANA en el grupo compartido suele ser mayor que en el disco.

b) DIANA para los procedimientos llamados se requiere en el grupo compartido solo cuando crea procedimientos. En los sistemas de producción, no se necesita DIANA en el grupo compartido (sino solo para el MCODE).

c) A partir de la versión 7.2, la DIANA para los cuerpos de los paquetes se desecha, no se utiliza y no se almacena en la base de datos. Esta es la razón por la que PARSED_SIZE (es decir, el tamaño de DIANA) de PACKAGE BODIES es 0.

Un paquete se almacena en DIANA en la base de datos, al igual que un procedimiento. Sin embargo, se puede usar un paquete para romper la cadena de dependencia, tal vez haciendo que esto desaparezca. Creo que TODO el código de producción (real) debe estar en un paquete, nunca en un procedimiento o función independiente.