Oracle 是谁想出了这个词;戴安娜节点“;他们如何计算6000000 LOC约为67108864(2**26)个节点?

Oracle 是谁想出了这个词;戴安娜节点“;他们如何计算6000000 LOC约为67108864(2**26)个节点?,oracle,plsql,Oracle,Plsql,在共享内存池中,包规范、对象类型规范、, 独立子程序或匿名块限制为67108864 (2**26)与标识符等令牌相对应的节点, 关键字、运算符等 戴安娜代表什么?我知道完整的表格。但实际上是什么呢 我已经提到 所以不要将此标记为重复 我想知道这个概念是什么,是谁创造了这个词等等,。。如果可能的话,他们是如何告诉我们的。“这允许大约6000000行代码,除非您超过PL/SQL编译器施加的限制”,它们是如何达到该值的?根据 PL/SQL基于编程语言Ada。 PL/SQL使用Ada(DIANA)的描述

在共享内存池中,包规范、对象类型规范、, 独立子程序或匿名块限制为67108864 (2**26)与标识符等令牌相对应的节点, 关键字、运算符等

戴安娜代表什么?我知道完整的表格。但实际上是什么呢

我已经提到 所以不要将此标记为重复

我想知道这个概念是什么,是谁创造了这个词等等,。。如果可能的话,他们是如何告诉我们的。“这允许大约6000000行代码,除非您超过PL/SQL编译器施加的限制”,它们是如何达到该值的?

根据

PL/SQL基于编程语言Ada。 PL/SQL使用Ada(DIANA)的描述性中间属性表示法的变体,Ada是一种树状结构的中间语言。 它是使用称为接口定义语言(IDL)的元表示法定义的。 DIANA由编译器和其他工具在内部使用

在编译时,PL/SQL源代码被翻译成机器可读的m代码。 过程或包的DIANA和m代码都存储在数据库中。 在运行时,它们被加载到共享内存池中。 DIANA用于编译依赖过程;简单地执行m代码

不幸的是,您无法根据解析的大小估计DIANA节点的数量。 具有相同解析大小的两个程序单元可能需要1500和2000个节点, 分别是因为,例如,第二个单元包含更复杂的SQL语句

更多关于DIANA node Calculations的信息,请阅读本书《1993年Ada欧洲:第12届Ada欧洲国际会议,Ada无国界医生》,法国巴黎,1993年6月14-18日。会议记录“

下面的支持说明很好地介绍了此主题

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:         
PL/SQL包的大小限制 在8.1.3之前的版本中,大型程序导致PLS-123错误。这发生了 因为编译器中存在真正的限制;不是因为一个错误

编译PL/SQL单元时,编译器会构建一个解析树。一个文件的最大大小 PL/SQL单元由解析树的大小决定。节点的最大数目 存在于该树中

在7.3版本之前,可以有2**14(16K)个diana节点,从8.0到8.1.3,2**15(32K) diana节点是允许的。对于8.1.3,此限制已放宽,因此您现在可以 此树中有2**26(即64M)个diana节点用于包和类型主体

源代码限制 虽然没有简单的方法来转换源代码行的限制,但我们观察到,每行源代码大约有5到10个节点。在8.1.3之前,编译器可以干净地编译多达3000行代码

从8.1.3开始,放宽了包体和类型体的限制,现在它们可以有大约6000000行代码

注意:此新限制仅适用于包体和类型体。此外,在达到这个特定的编译器限制之前,您现在可以开始达到其他一些编译器限制

就源代码大小而言,假设标记(标识符、运算符、函数等)平均有四个字符长。那么,最大值将是:

   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
这是一个粗略的估计。如果您的代码有许多空格、长标识符等,您可以 最终得到的源代码比这还要大。您也可能最终得到更小的源代码 如果你的信息源使用很短的标识符,等等

注意,这是每个程序单元的,所以包体最有可能遇到这种情况 限制

如何检查包的当前大小 要检查包的大小,可以使用的最接近的相关数字是按大小解析的 数据字典查看用户\对象\大小。此值提供了中的DIANA的大小 存储在SYS.IDL_xxx$表中的字节,不是共享池中的大小

PL/SQL代码的DIANA部分(在编译期间使用)的大小在中要大得多 共享池的大小超过了它在系统表中的大小

例如,当解析的_大小为时,您可能开始遇到64K限制的问题 用户\对象\大小不超过50K

对于一个包,解析后的大小或DIANA的大小只对整个包有意义 对象,而不是单独用于规范和主体

如果为包选择parsed_大小,则会收到不同的源代码大小 规范和主体,但只有整个对象的有意义的解析大小 是包装规格的在线输出。对于解析的_大小,输出0 在包裹体的行上

以下示例演示了此行为:

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在数据库中同时存储DIANA和MCODE。MCODE是实际运行的代码, 而特定库单元X的DIANA包含 使用库单元X编译过程

以下是几点注意事项:

a) 戴安娜是IDL的代表。IDL的线性版本存储在磁盘上。这个 实际的解析树被构建并存储在共享池中。这就是为什么 共享池中的数据通常比磁盘上的数据大

b) 只有在创建时,共享池中才需要调用过程的数据 程序。在生产系统中,共享池中不需要DIANA (但仅适用于MCODE)

c) 从7.2版开始,包体的DIANA被丢弃,不再使用, 而不是存储在数据库中。这就是为什么 包体为0

因此,应始终定义大型过程和功能 包装内

一个包裹存放在滇
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';  

  .....