在Oracle中使用小blob是否合理?

时间:2009-02-12 07:41:23

标签: oracle blob

在Oracle中,LongRaw和Varchar2在Oracle中的最大长度为4kb,但我需要存储8kb和8kb的对象。 16kb,所以我想知道什么是一个好的解决方案。我知道我可以使用Blob,但Blob具有可变长度,如果我是正确的话,它基本上是幕后的额外文件,功能和价格我对支付我的对象不感兴趣。 是否有更适合此类需求的其他解决方案或数据类型?

由于

5 个答案:

答案 0 :(得分:3)

blob不是幕后的文件。它存储在数据库中。为什么它的长度可变?您可以使用blob列(如果数据是文本数据,则使用clob),并将其存储在自己的段中。

答案 1 :(得分:2)

为什么不分割二进制数据并将其存储在4K块中?对于这些块,您可以有四个不同的列(以及用于将它们重建为大型结构的长度列),或者是另一个表的更规范化的方式,其中的块连接到原始表记录。

如果您将来需要扩展,这将提供扩展。

例如:

Primary table:
    -- normal columns --
    chunk_id integer
    chunk_last_len integer
Chunk table:
    chunk_id integer
    chunk_sequence integer
    chunk varchar2(whatever)
    primary key (chunk_id,chunk_sequence)

当然,您可能会发现您的DBMS确实在BLOB的掩盖下完成了这种行为,让Oracle处理它可能更有效,从而减轻了从单个块手动重建数据的需要。我会衡量每种方法的表现,以找出最佳方法。

答案 2 :(得分:2)

不要将二进制数据存储在varchar2列中,除非您愿意对它们进行编码(base64或类似)。字符集问题可能会破坏您的数据!

请尝试以下语句查看效果:

从user_tab_columns中选择* from(选择rownum-1 original,ascii(chr(rownum-1))数据,其中rownum< = 256)其中原始<>数据;

答案 3 :(得分:2)

你应该使用BLOB。

BLOB不会作为额外文件存储,而是作为一个块存储在您的一个数据文件中(就像其他数据一样)。如果BLOB对于单个块而言变得太大(在您的情况下可能不会发生),那么它将在另一个块中继续。

如果您的BLOB数据非常小,您可以让Oracle将其与您行中的其他数据(如varchar2)内联存储。

在内部,Oracle正在做类似于PAX建议的事情。块与DB块一样大,减去一些开销。如果您尝试在Oracle之上重新发明Oracle功能,那么它只会比原生功能慢。

您还必须重新实现DBMS_LOB中已提供的一整套功能(长度,比较等)。

答案 4 :(得分:1)

Varchar2也是可变长度的。如果您需要在数据库中存储任何大于小尺寸的二进制数据,则必须查看blob的方向。另一个解决方案当然是将二进制文件存储在文件系统的某个位置,并将该文件的路径存储为db中的varchar。