Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Quem criou o termo nó DIANA e como eles descobriram que 6.000.000 LOC são aproximadamente 67108864 (2**26) nós DIANA?


Conforme documentação do Oracle ,

PL/SQL é baseado na linguagem de programação Ada.PL/SQL usa uma variante de Descriptive Intermediate Attributed Notation for Ada (DIANA), uma linguagem intermediária estruturada em árvore. Ela é definida usando uma meta-notação chamada Interface Definition Language (IDL) .DIANA é usado internamente por compiladores e outras ferramentas.

Em tempo de compilação, o código-fonte PL/SQL é traduzido em código m legível por máquina. Tanto o DIANA quanto o código m de um procedimento ou pacote são armazenados no banco de dados. Em tempo de execução, eles são carregados no conjunto de memória compartilhada. O DIANA é usado para compilar procedimentos dependentes; o código-m é simplesmente executado.

Infelizmente, não é possível estimar o número de nós DIANA a partir do tamanho analisado. Duas unidades de programa com o mesmo tamanho analisado podem exigir 1.500 e 2.000 nós DIANA, respectivamente, porque, por exemplo, a segunda unidade contém instruções SQL mais complexas.

Pergunte ao tom diz

Para saber mais sobre cálculos de nós DIANA, leia este livro "Ada-Europe '93:12th Ada-Europe International Conference, "Ada Sans Frontieres", Paris, France, June 14-18, 1993. Proceedings"

A nota de suporte a seguir aborda bem esse tópico...
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:         

Visão geral


Este artigo contém informações sobre limitações de tamanho de pacote PL/SQL. Quando os limites são atingidos, você recebe o seguinte erro:
PLS-123 Program too large

Limitações de tamanho em pacotes PL/SQL


Em versões anteriores a 8.1.3, programas grandes resultavam no erro PLS-123. Isso ocorreu devido a limites genuínos no compilador; não como resultado de um bug.

Ao compilar uma unidade PL/SQL, o compilador constrói uma árvore de análise sintática. O tamanho máximo da unidade aPL/SQL é determinado pelo tamanho da árvore de análise. Existe um número máximo de nós diana nesta árvore.

Até 7.3, você poderia ter 2 * * 14 (16K) nós de Diana, e de 8.0 a 8.1.3, 2 * * 15 (32K) nós de Diana eram permitidos. Com a versão 8.1.3, esse limite foi relaxado para que agora você possa ter 2 * * 26 (ou seja, 64M) nós de diana nesta árvore para corpos de pacotes e tipos.

Limites do código-fonte


Embora não haja uma maneira fácil de traduzir os limites em termos de linhas de código-fonte, observamos que houve aproximadamente 5 a 10 nós por linha de código-fonte. Antes do 8.1.3, o compilador podia compilar de forma limpa até cerca de 3.000 linhas de código.

A partir do 8.1.3, o limite foi relaxado para corpos de pacotes e corpos de tipo que agora podem ter aproximadamente até cerca de 6.000.000 linhas de código.

Observações:Esse novo limite se aplica apenas a corpos de pacote e corpos de tipo. Além disso, agora você pode começar a atingir alguns outros limites do compilador antes de atingir esse limite específico do compilador.

Em termos de tamanho do código-fonte, suponha que os tokens (identificadores, operadores, funções etc.) tenham em média quatro caracteres. Então, o máximo seria:
   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 é uma estimativa aproximada. Se o seu código tiver muitos espaços, identificadores longos, etc., você pode acabar com um código-fonte maior que isso. Você também pode acabar com um código-fonte menor do que isso se suas fontes usarem identificadores muito curtos, etc.

Observe que isso é por unidade de programa, portanto, é mais provável que os corpos dos pacotes encontrem esse limite.

Como verificar o tamanho atual de um pacote


Para verificar o tamanho de um pacote, o número relacionado mais próximo que você pode usar é PARSED_SIZE na visualização do dicionário de dados USER_OBJECT_SIZE. Esse valor fornece o tamanho dos inbytes do DIANA conforme armazenado nas tabelas SYS.IDL_xxx$ e NÃO é o tamanho do pool compartilhado.

O tamanho da parte DIANA do código PL/SQL (usado durante a compilação) é MUITO maior no pool compartilhado do que na tabela do sistema.

Por exemplo, você pode começar a ter problemas com um limite de 64 K quando o PARSED_SIZE em USER_OBJECT_SIZE não for maior que 50 K.

Para um pacote, o tamanho analisado ou o tamanho do DIANA faz sentido apenas para o objeto inteiro, não separadamente para a especificação e o corpo.

Se você selecionar tamanho_parsed para um pacote, receberá tamanhos de código e fonte separados para a especificação e o corpo, mas apenas um tamanho analisado significativo para todo o objeto que é gerado na linha para a especificação do pacote. Um 0 é gerado para o parsed_size na linha do corpo do pacote.

O exemplo a seguir demonstra esse comportamento:
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';  

  .....

O Oracle armazena DIANA e MCODE no banco de dados. MCODE é o código real que é executado, enquanto DIANA para uma determinada unidade de biblioteca X contém informações necessárias para compilar procedimentos usando a unidade de biblioteca X.

Seguem várias notas:

a) DIANA está representada no IDL. A versão linear do IDL é armazenada em disco. A árvore de análise real é construída e armazenada no pool compartilhado. É por isso que o tamanho de DIANA no pool compartilhado geralmente é maior do que no disco.

b) DIANA para procedimentos chamados é necessário no pool compartilhado somente quando você cria procedimentos. Em sistemas de produção, não há necessidade de DIANA no pool compartilhado (mas apenas para o MCODE).

c) A partir da versão 7.2, o DIANA para corpos de pacotes é descartado, não é usado e não é armazenado no banco de dados. É por isso que o PARSED_SIZE (ou seja, o tamanho de DIANA) de PACKAGE BODIES é 0.

Um pacote é armazenado em DIANA no banco de dados, assim como um procedimento. No entanto, um pacote pode ser usado para quebrar a cadeia de dependências, talvez fazendo com que isso desapareça. É minha convicção que o código ALLproduction (real) deve estar em um pacote, nunca em um procedimento ou função independente.