嵌套表和 VARRAY 之间的区别

Posted

技术标签:

【中文标题】嵌套表和 VARRAY 之间的区别【英文标题】:Difference between NESTED TABLE and VARRAY 【发布时间】:2015-06-29 13:03:29 【问题描述】:

我知道两者的基本区别和用途。但是,我正在寻找的答案是,为什么要引入 VARRAY ?

因为,我们可以使用 NESTED TABLE 做同样的事情,而使用 VARRAY 可以做同样的事情,反之亦然,在某些情况下是不可能的。另外,我注意到人们提到的一些地方 VARRAY 存储元素in-line。这是什么意思 ?谁能解释两者的内部存储和处理?

【问题讨论】:

【参考方案1】:

总而言之,您将在以下情况下使用 可变大小数组 又名 VARRAY

元素的数量在填充之前是已知的。 元素需要按顺序访问 保证元素顺序

例如,VARRAY 声明为:

TYPE varray_emp IS VARRAY(14) OF emp%ROWTYPE;
emp_rec varray_emp;

所以,您会看到 UPPER BOUND 是固定的,在上面的示例中是 14。

有关详细信息,请参阅documentation。

更新关于在数据库中存储VARRAY

引用上述文档链接:

每个 varray 都存储为单个对象,或者在 它是一列(如果 varray 小于 4KB)或在 表但仍在同一个表空间中(如果 varray 大于 4KB)。您必须在 同时,这在执行某些操作时最合适 所有元素一次。但是您可能会发现存储不切实际 并以这种方式检索大量元素。

关于在线存储:

varray 通常存储在行中,即在同一个表空间中 作为其行中的其他数据。如果它足够大,Oracle 将其存储为 BLOB

阅读更多关于Storage Considerations for Varrays

【讨论】:

我知道你上面的回答。我真正要找的是,它们是如何存储的?内嵌存储是什么意思? 查看VARRAY的存储及行内存储含义的更新。 内联存储的意思是,值像简单值一样存储,例如数字或(短)文本。大纲的意思是,值存储在一个额外的表中,这个表甚至可以在另一个表空间中,因此甚至在不同的物理硬盘上,尽管数据属于你表中的单个记录。 同意。但是,关于数字,它们在内部再次存储为不同大小的字符。而且,当行大小由于 VARRAY 而充分增加时,它的处理方式与 BLOB 相同。【参考方案2】:

有两个主要的重要区别:

    VARRAY 声明中需要最大元素数(限制)。 在嵌套的 TABLE 类型集合中无法进行限制。

    可以在 VARRAY 中进行内联存储(嵌套的 TABLE 总是脱线)

    如果集合类型被用作数据库中的普通表列类型:

    离线-嵌套表数据存储在不同的数据库段中 比主表行。 对于嵌套表段类型是 NESTED TABLE。

    内联 - 存储在主表行中的嵌套行。

    用于 VARRAY CLOB。 数据库将在表列中存储少于 +-4000 字节数据的 LOB。 https://docs.oracle.com/cd/B28359_01/appdev.111/b28393/adlob_tables.htm#i1010742

【讨论】:

【参考方案3】:

b/w 嵌套表和可变数组的区别:

将为其他嵌套表创建单独的表空间 比父表的表空间。 如果 varray 大小小于 4 KB,则将其存储在作为列的表内,否则,将存储在表外但在同一表空间中。 可以对嵌套表的单个元素执行更新、删除。 无法对 Varray 中的单个元素执行更新和删除。 有关更多说明,请通过下面的链接。 http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/05_colls.htm

【讨论】:

请发布您的报价来源。 请参考docs.oracle.com/cd/B10501_01/appdev.920/a96624/05_colls.htm链接。

以上是关于嵌套表和 VARRAY 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

两个嵌套表集合之间的plsql区别

嵌套表和立即执行

嵌套表和表头的语义

解析嵌套查询 Android

Spring Boot如何通过查找表将两个实体嵌套在一起而返回另一个实体?

在 LINQ 中,Join 和从嵌套查询中选择第一项之间有啥区别