Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wer hat den Begriff DIANA-Knoten erfunden und wie haben sie herausgefunden, dass 6.000.000 LOC ungefähr 67108864 (2 ** 26) DIANA-Knoten sind?

Gemäß Oracle-Dokumentation ,

PL/SQL basiert auf der Programmiersprache Ada.PL/SQL verwendet eine Variante der Descriptive Intermediate Attributed Notation for Ada (DIANA), einer baumstrukturierten Zwischensprache. Sie wird mit einer Meta-Notation namens Interface Definition Language (IDL) definiert. .DIANA wird intern von Compilern und anderen Tools verwendet.

Zur Kompilierzeit wird der PL/SQL-Quellcode in maschinenlesbaren M-Code übersetzt. Sowohl der DIANA- als auch der M-Code für eine Prozedur oder ein Paket werden in der Datenbank gespeichert. Zur Laufzeit werden sie in den gemeinsam genutzten Speicherpool geladen. Die DIANA wird verwendet, um abhängige Prozeduren zu kompilieren; der M-Code wird einfach ausgeführt.

Leider können Sie die Anzahl der DIANA-Knoten nicht aus der geparsten Größe abschätzen. Zwei Programmeinheiten mit der gleichen geparsten Größe können 1500 bzw. 2000 DIANA-Knoten erfordern, da beispielsweise die zweite Einheit komplexere SQL-Anweisungen enthält.

Frag Tom sagt

Weitere Informationen zu DIANA-Knotenberechnungen finden Sie in diesem Buch "Ada-Europe '93:12th Ada-Europe International Conference, "Ada Sans Frontieres", Paris, France, June 14-18, 1993. Proceedings"

Der folgende Support-Hinweis deckt dieses Thema gut ab...

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:         

Übersicht

Dieser Artikel enthält Informationen zu Größenbeschränkungen für PL/SQL-Pakete. Wenn Limits erreicht sind, erhalten Sie die folgende Fehlermeldung:

PLS-123 Program too large

Größenbeschränkungen für PL/SQL-Pakete

In Versionen vor 8.1.3 führten große Programme zum Fehler PLS-123. Dies geschah aufgrund echter Beschränkungen im Compiler; nicht als Ergebnis eines Fehlers.

Beim Kompilieren einer PL/SQL-Einheit erstellt der Compiler einen Analysebaum. Die maximale Größe einer PL/SQL-Einheit wird durch die Größe des Analysebaums bestimmt. In diesem Baum existiert eine maximale Anzahl von Diana-Knoten.

Bis 7.3 konnten Sie 2 * * 14 (16K) Diana-Knoten haben, und von 8.0 bis 8.1.3 waren 2 * * 15 (32K) Diana-Knoten erlaubt. Mit 8.1.3 wurde dieses Limit gelockert, sodass Sie jetzt 2 * * 26 (d. h. 64 Millionen) Diana-Knoten in diesem Baum für Paket- und Typkörper haben können.

Quellcode-Limits

Obwohl es keine einfache Möglichkeit gibt, die Grenzen in Quellcodezeilen zu übersetzen, haben wir beobachtet, dass es ungefähr 5 bis 10 Knoten pro Quellcodezeile gab. Vor 8.1.3 konnte der Compiler bis zu etwa 3.000 Codezeilen sauber kompilieren.

Beginnend mit 8.1.3 wurde das Limit für Paketkörper und Typkörper gelockert, die jetzt ungefähr bis zu etwa 6.000.000 Codezeilen haben können.

Hinweise:Diese neue Grenze gilt nur für Gehäusekörper und Typenkörper. Außerdem können Sie jetzt anfangen, einige andere Compiler-Limits zu erreichen, bevor Sie dieses spezielle Compiler-Limit erreichen.

Gehen Sie in Bezug auf die Größe des Quellcodes davon aus, dass Token (Bezeichner, Operatoren, Funktionen usw.) im Durchschnitt vier Zeichen lang sind. Dann wäre das Maximum:

   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

Dies ist eine grobe Schätzung. Wenn Ihr Code viele Leerzeichen, lange Bezeichner usw. enthält, erhalten Sie am Ende möglicherweise einen größeren Quellcode. Sie können auch mit einem kleineren Quellcode enden, wenn Ihre Quellen sehr kurze Identifikatoren usw. verwenden.

Beachten Sie, dass dies pro Programmeinheit gilt, sodass Paketkörper höchstwahrscheinlich auf dieses Limit stoßen.

So überprüfen Sie die aktuelle Größe eines Pakets

Um die Größe eines Pakets zu überprüfen, ist die nächste verwandte Zahl, die Sie verwenden können, PARSED_SIZE in der Datenwörterbuchansicht USER_OBJECT_SIZE. Dieser Wert stellt die Größe der DIANA-Inbytes bereit, wie sie in den SYS.IDL_xxx$-Tabellen gespeichert sind, und ist NICHT die Größe im gemeinsam genutzten Pool.

Die Größe des DIANA-Teils des PL/SQL-Codes (der während der Kompilierung verwendet wird) ist im gemeinsam genutzten Pool VIEL größer als in der Systemtabelle.

Beispielsweise können Probleme mit einer Beschränkung auf 64 KB auftreten, wenn die PARSED_SIZE in USER_OBJECT_SIZE nicht mehr als 50 KB beträgt.

Für ein Paket ist die geparste Größe oder Größe der DIANA nur für das gesamte Objekt sinnvoll, nicht getrennt für die Spezifikation und den Körper.

Wenn Sie für ein Paket parsed_size auswählen, erhalten Sie getrennte Quell- und Codegrößen für die Spezifikation und den Körper, aber nur eine sinnvolle geparste Größe für das gesamte Objekt, die auf der Zeile für die Paketspezifikation ausgegeben wird. Auf der Zeile für den Paketkörper wird für die parsed_size eine 0 ausgegeben.

Das folgende Beispiel demonstriert dieses Verhalten:

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 speichert sowohl DIANA als auch MCODE in der Datenbank. MCODE ist der tatsächliche Code, der ausgeführt wird, während DIANA für eine bestimmte Bibliothekseinheit X Informationen enthält, die zum Kompilieren von Prozeduren unter Verwendung von Bibliothekseinheit X benötigt werden.

Im Folgenden finden Sie einige Hinweise:

a) DIANA ist in IDL vertreten. Die lineare Version von IDL ist auf der Festplatte gespeichert. Der eigentliche Analysebaum wird aufgebaut und in dem gemeinsam genutzten Pool gespeichert. Aus diesem Grund ist die Größe von DIANA im gemeinsam genutzten Pool normalerweise größer als auf der Festplatte.

b) DIANA für aufgerufene Prozeduren wird im gemeinsam genutzten Pool nur benötigt, wenn Sie Prozeduren erstellen. In Produktivsystemen wird DIANA im Shared Pool nicht benötigt (sondern nur für den MCODE).

c) Ab Release 7.2 wird die DIANA für Packstückkörper verworfen, nicht verwendet und nicht in der Datenbank gespeichert. Aus diesem Grund ist die PARSED_SIZE (d. h. die Größe von DIANA) von PACKAGE BODIES 0.

Ein Paket wird wie eine Prozedur in DIANA in der Datenbank gespeichert. Ein Paket kann jedoch verwendet werden, um die Abhängigkeitskette zu unterbrechen, wodurch dies möglicherweise beseitigt wird. Ich bin davon überzeugt, dass ALLE (echten) Produktionscodes in einem Paket enthalten sein sollten, niemals in einer eigenständigen Prozedur oder Funktion.