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