This question already has answers here:
Who is diana, and why won't she let my database objects compile?

(5个答案)


2年前关闭。






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


DIANA代表什么?我知道完整的表格。但是实际上是什么?

我已经提到了
Who is diana, and why won't she let my database objects compile?
因此请勿将此标记为重复。

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

最佳答案

根据Oracle documentation

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

在编译时,PL / SQL源代码被转换为机器可读的m代码。
过程或程序包的DIANA代码和m代码都存储在数据库中。
在运行时,它们被加载到共享内存池中。
DIANA用于编译相关程序。只需执行m代码。

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

Ask tom says

有关DIANA节点计算的更多信息,请阅读这本书“ Ada-Europe '93:第12届Ada-Europe国际会议,“ Ada Sans Frontieres”,法国巴黎,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程序包大小限制的信息。当极限
达到,您会收到以下错误:

PLS-123 Program too large


PL / SQL软件包的大小限制

在8.1.3之前的版本中,大型程序导致PLS-123错误。这发生了
由于编译器的真正限制;不是错误的结果。

编译PL / SQL单元时,编译器会构建一个解析树。最大尺寸
PL / SQL单位由解析树的大小确定。最大diana节点数
存在于这棵树中。

最高到7.3,您可能拥有2 * * 14(16K)个diana节点,从8.0到8.1.3,2 * * 15(32K)
允许戴安娜节点。在8.1.3中,此限制已放宽,因此您现在可以
在这棵树中有2 * * 26(即64M)个diana节点用于包和类型主体。

源代码限制

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

从8.1.3开始,放宽了对于程序包主体和类型主体的限制,这些主体现在可以包含大约6,000,000行代码。

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

就源代码大小而言,假定令牌(标识符,运算符,函数等)平均长度为四个字符。然后,最大值将是:

   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


这是一个粗略的估计。如果您的代码包含很多空格,长标识符等,则可能
最终得到的源代码比这大。您可能还会得到较小的源代码
如果您的来源使用非常短的标识符等,则不可以。

请注意,这是按程序单位进行的,因此程序包主体最有可能遇到此问题
限制。

如何检查包装的当前尺寸

要检查包裹的尺寸,可以使用的最接近的相关编号是的PARSED_SIZE
数据字典视图USER_OBJECT_SIZE。该值提供了DIANA的大小
字节数存储在SYS.IDL_xxx $表中,并且不是共享池中的大小。

PL / SQL代码的DIANA部分(在编译期间使用)的大小在
共享池比系统表中的共享池多。

例如,当您将PARSED_SIZE输入时,您可能会遇到限制为64K的问题
USER_OBJECT_SIZE不超过50K。

对于包,解析的大小或DIANA的大小仅对整个包有意义
对象,而不是单独针对规格和主体。

如果为程序包选择parsed_size,则将收到单独的源和代码大小
规范和主体,但对于整个对象而言,只有有意义的解析大小,
在包装规格行上输出。 parsed_size的输出为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)DIANA在IDL中代表。 IDL的线性版本存储在磁盘上。的
实际的分析树已构建并存储在共享池中。这就是为什么
共享池中的DIANA通常大于磁盘上的DIANA。

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

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


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


就像过程一样,程序包也存储在数据库的DIANA中。一个包可以用来
但是打破了依赖链,也许可以解决这个问题。我相信所有
生产(实际)代码应放在程序包中,而不是在独立的过程或函数中。

关于oracle - 谁提出了“DIANA节点”这个术语,他们如何计算出6,000,000 LOC约为67108864(2 ** 26)个DIANA节点? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20348752/

10-09 06:04