Oracle Blob - 存储大小还是计算?

Posted

技术标签:

【中文标题】Oracle Blob - 存储大小还是计算?【英文标题】:Oracle Blobs - store size or calculate? 【发布时间】:2010-03-09 16:59:31 【问题描述】:

我正在编写一个通用的 Http 资源托管服务,并将较大的对象作为 BLOB 存储在 Oracle 数据库中。我希望能够在返回存储对象时设置“Content-Length”标头,这意味着我需要在开始将 BLOB 写入客户端之前知道它的大小(我知道我可以使用分块编码,并且我在某些情况下)。是否有人对调用 dbms_lob.getlength() 对每次读取产生的性能影响有任何经验,还是我应该在 INSERT 上计算 BLOB 大小并将其存储在表中?平均而言,我希望写入速率高于读取速率。我现在正在编写一个基准测试来尝试看看影响是什么,但这似乎是一个常见的问题,我认为有人可能已经弄清楚了这一点。此外,使用 JDBC/Spring 3,我什至如何计算写入时的 BLOB 大小? (而且我不能使用触发器或存储过程)谢谢。

【问题讨论】:

测量,测量,测量。猜测只是猜测。 与往常一样,但对于像 Oracle(被数千人使用)这样的东西,这似乎是一种非常常见的范例,并且许多 DBA 已经解决了这一问题。如果有任何“陷阱”,我想知道。 【参考方案1】:

我做了一个快速检查,从表中选择了一个 BLOB,然后选择了 LENGTH(BLOB) 和 DBMS_LOB.GETLENGTH(BLOB)。 选择 BLOB 本身时,我得到了 44 个一致的获取。当我选择长度(通过任何一种方法)时,我得到了 7 个一致的结果。

基于此,当我获得长度时,它不会检索整个 blob 并计算长度。假设它存储在 BLOB 开头的长度是明智的(就像它们存储 VARCHAR2 值的长度一样)并且直接使用它。

因此,在导出长度而不是存储长度时不应该有很大的开销。它还减少了不一致的机会。

【讨论】:

有一个 LOB INDEX 是一个单独的段,所以如果你的 LOB 不能按行存储,它可以快速找到需要使用多少块。简而言之,OP 应该在获取单个 LOB 时同时获取 DBMS_LOB.GETLENGTH(),而不是存储可能不正确的值。 另外,在 11g 中,您可以使用虚拟列来提供 blob 的长度。【参考方案2】:

因为我们的 BLOBS 通常压缩得很好,所以我们采用了这种方法:-

存储压缩的 BLOB。当我们流入 BLOB 时,压缩是在 java 端完成的 在同一张表的另一列中记录未压缩的大小(以字节为单位) 在我们再次发送 BLOB 时通过流解压缩,知道内容大小将是多少

如果您的 BLOB 是可压缩的,您可以考虑这种方法。

【讨论】:

【参考方案3】:

因为我还没有看到任何答案..

我没有亲自测量过任何东西,但我们的 DBA 建议存储它们的大小(我知道,只是他告诉我的)。不过他非常好,所以我个人认为存储大小是要走的路——至少如果它对性能至关重要(我们不得不调用 .length() 很多)。

【讨论】:

一些 DBA 会说任何老话。一个好的 DBA 将能够敲出一个代码示例来证明他们的断言是正确的。

以上是关于Oracle Blob - 存储大小还是计算?的主要内容,如果未能解决你的问题,请参考以下文章

使用delphi向oracle中写入大数据blob文件,文件大小1G左右,有没有啥方法能够解决呢?

Oracle 大对象块存储

将 Blob 的上传大小限制到 Azure Blob 存储

Azure Blob 存储的文件大小限制?

如何限制 ASA 输出中的 blob 存储文件大小

如何获取云存储对象的 blob 大小?