谁提出了“DIANA 节点”这个术语?他们是如何计算出 6,000,000 LOC 大约是 67108864 (2**26) 个 DIANA 节点? [复制]

2023-12-20

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

戴安娜代表什么?我知道完整的表格。但它到底是什么?

我已经提到过戴安娜是谁,为什么她不让我的数据库对象编译? https://stackoverflow.com/questions/7764656/who-is-diana-and-why-wont-she-let-my-database-objects-compile所以不要将其标记为重复。

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


As per Oracle文档 http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/limits.htm,

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

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

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

问汤姆说 http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:571023051648

有关 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:         

Overview

本文包含有关 PL/SQL 包大小限制的信息。当限制为 达到时,您会收到以下错误:

PLS-123 Program too large

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) 个节点 允许戴安娜节点。在 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 通常大于磁盘上的。

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

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

因此,应该始终定义大型过程和函数 包内!

包存储在 DIANA 数据库中,就像过程一样。一个包可以用来 然而,打破依赖链,也许会让这个问题消失。我相信所有 生产(真实)代码应该位于包中,而不是位于独立的过程或函数中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谁提出了“DIANA 节点”这个术语?他们是如何计算出 6,000,000 LOC 大约是 67108864 (2**26) 个 DIANA 节点? [复制] 的相关文章

  • 如何修复“Oracle.EntityFrameworkCore 类型中的方法‘get_Info’没有实现”。

    我正在尝试通过 EW 连接到 Oracle DB 论方法OnConfiguring是错误 System TypeLoadException 程序集 Oracle EntityFrameworkCore Version 2 0 19 1 Cu
  • 在sql plus脚本中运行循环

    我正在 sql plus 中运行脚本 我的脚本中有一个 for 循环 BEGIN FOR count IN 1 100 LOOP INSERT INTO CompanyShare VALUES count 1 250 END LOOP EN
  • 如何在Oracle中从表中选择列,*?

    我正在创建很多脚本 有时为了检查表是否根据我的需要进行更新 我会即时编写几个 SELECT 语句 在 SQL SERVER 中你可以这样写 SELECT Column1 FROM MY TABLE 出于可见性原因 这很有用 但是这似乎在 O
  • Oracle如何将UTC时间转换为本地时间(缺少偏移信息)

    我有一个包含日期列的表 我认为该列中的日期是以 UTC 格式保存的 我希望检索日期时以当地时间打印 这意味着当我从德国调用日期时 结果应该是这样的 2015 04 29 11 24 06 0200UTC EUROPE BERLIN 我尝试了
  • 如何检查oracle数据库中分配给模式、角色的对象的权限(DDL、DML、DCL)?

    大多数时候 我们都在与愚蠢的事情作斗争 以获取架构 角色及其对象的权限详细信息 并尝试找到一些简单的方法来获取有关它的所有详细信息以及伪查询代码 以批量生成授予语句以供进一步使用执行 所以我们在这里得到它 关于数据字典视图前缀的一些简单介绍
  • 使用 Hibernate 将 Oracle 日期映射到 Java 对象

    我收到消息 文字与格式字符串不匹配 例如 以下是 Java 类中的一些方法 public String getDateTime public void setDateTime String date time 以下是该类的 Hibernat
  • 如何更新 pl/sql 中嵌套表的列? [复制]

    这个问题在这里已经有答案了 我正在尝试在表中创建一个可以存储多个值的列 如下所示 我有一个学生id std和一个名为marks可以采用几个值 例如2 3 4 我想更新此列表以添加另一个标记2 3 4 5但我不知道怎么做 我如何更新专栏mar
  • 根据由另一列分组的不同列的最大值获取值[重复]

    这个问题在这里已经有答案了 我想根据由另一列分组的不同列的最大值来获取列的值 我有这张表 KEY NUM VAL A 1 AB B 1 CD B 2 EF C 2 GH C 3 HI D 1 JK D 3 LM 并想要这样的结果 KEY V
  • 以编程方式插入行(父行和子行)

    我正在使用 Spring 和 JDBCTemplate 该场景是 CUSTOMER 表和 ORDERS 表的父子关系 我想做一个插入 例如 1 个客户和 5 个订单 但我不确定如何以编程方式在 CUSTOMER 表中插入一行 如何获取 Or
  • 插入具有多个值的外键

    我想知道 是否有可能创建一个表 其中我有一个接受外键但同一行可能有多个值的表 例如 Employee id name skillid Skill Skillid skillname 这里 Employee 的一个例子可以是 Employee
  • 在Oracle中使用IW和MM

    我使用 IW 表示每周结果 使用 MM 表示每月结果 但我总是收到错误 ORA 00979 not a GROUP BY expression 00979 00000 not a GROUP BY expression 我的疑问是这些 We
  • 没有提示指令的直连接中表的顺序是否会影响性能?

    所有基于 SQL 的 RDBMS 10 年前的版本 直接连接查询 没有提示指令 中的表顺序是否会对最佳性能和内存管理产生影响 听说最后一个join应该是最大的表 您的数据库的查询优化器如何处理这种情况 回答你的问题 是的 表的顺序在连接中有
  • php oracle客户端oci8安装出现什么问题

    我尝试了安装 PHP Oracle 客户端的所有过程 1 我安装了客户端版本8和32位 2 我在php ini中取消了oci的注释 3 重新启动Wamp 4 不确定是否真的安装 但我在 php ini 中得到了引用 5 但仍然无法连接 泰汉
  • 使用 Oracle Sql Developer 生成 DDL 以包含外键

    我尝试了一些使用 SQL Developer 从 Oracle 数据库生成 DDL 的选项 但没有一个符合目的 快速 DDL 选项会产生没有外键约束的 DDL 我很喜欢这种格式 表上的编辑导致 DDL 包括我无法摆脱的存储和日志记录 只是想
  • CONTAINS 不适用于 Oracle Text

    我在执行此查询时遇到问题 SELECT FROM gob attachment WHERE CONTAINS gob a document java gt 0 它给了我 ORA 29902 error in executing ODCIIn
  • Oracle 存储过程的全局临时表的替代方法

    我已阅读并理解 Oracle 仅使用全局临时表 这与允许 temp 表的 MS SQL 不同 我遇到的情况需要我创建数百个全局临时表 以完成我正在进行的从 MS SQL 到 Oracle 的数据库转换 我想知道除了创建必须在数据库中维护的所
  • 如何在 Oracle 中按组填充缺失日期并更改计数值

    这是对我之前发布的问题的轻微修改 如何在 Oracle 中按组填写缺失的日期 https stackoverflow com questions 63002363 how do i fill in missing dates by grou
  • ODP.Net - OracleDataReader.读取速度非常慢

    我在 ODP Net 中的 OracleDataReader 方面遇到很多麻烦 基本上 我有一个参数化查询 需要 1 5 秒的时间来运行 返回大约 450 条记录 然后需要 60 90 秒的时间来循环 甚至没有代码在循环中运行 实际上是迭代
  • PL/SQL 过程:如何返回 select 语句?

    我想创建一个存储过程 on ORACLE数据库服务器我的问题是 我不知道如何返回 select 语句 这是程序中应包含的逻辑 输入参数 过滤器1 int 过滤器2 字符串 with cte as select val1 val2 stdde
  • 什么是 Oracle 会话?

    我使用的是 Oracle 11g 我正在寻找 Oracle 会话的良好解释 我用谷歌搜索了这个 但奇怪的是 没有一个网站包含任何关于预言机会话是什么的解释 我的具体问题是 1 什么是预言机会话 2 一个连接对象是否总是与一个 oracle

随机推荐