Oracle 从数据库查询二进制数据的最佳实践是什么?

Oracle 从数据库查询二进制数据的最佳实践是什么?,oracle,binary-data,Oracle,Binary Data,我被要求为一个数据库(Oracle)添加查询功能,该数据库主要包含二进制数据。 因此,我需要能够在几千字节的blob内查询二进制范围。我以前从来没有这样做过,所以我想知道在启动这样的项目时需要考虑哪些好的实践和陷阱。 谢谢不知道您的具体要求,我只能作一些一般性的评论 oracle中的blob不是最快速的类型。确保您的构建不是为了 您的设计中存在许多性能瓶颈,并且确实需要在上运行性能测试 您尽快构建的功能,以确保它满足需求 dbms_lob是你的朋友。特别是,您可能会发现read和substr函数

我被要求为一个数据库(Oracle)添加查询功能,该数据库主要包含二进制数据。 因此,我需要能够在几千字节的blob内查询二进制范围。我以前从来没有这样做过,所以我想知道在启动这样的项目时需要考虑哪些好的实践和陷阱。
谢谢

不知道您的具体要求,我只能作一些一般性的评论

oracle中的blob不是最快速的类型。确保您的构建不是为了 您的设计中存在许多性能瓶颈,并且确实需要在上运行性能测试 您尽快构建的功能,以确保它满足需求

dbms_lob是你的朋友。特别是,您可能会发现read和substr函数(用于读取blob的一部分)非常有用

远离外部C风格的程序——它们可能会很慢。 PL/SQL函数往往要快得多。我不知道Java程序。就像java一样 引擎与Oracle的集成度更高,它们可能非常适合使用。也许值得 对PL/SQL和Java进行初步的概念验证

使用Java,您将能够以byte[]流的形式读取数据并进行操作 使用world f Java,您会感到心满意足。Java的外部过程很容易实现——您甚至可以将Java源代码提供给Oracle

对于PL/SQL,我们发现一种非常有用的技术是将blob转换为原始数据,并将其转换为 一个varchar,然后将其转换为十六进制,然后操作十六进制(字符串) 使用标准的Oracle字符串函数。即:

create or replace function retrieve_data_from_blob (
    b blob
    , tag_code
)
as
    lw long raw;
    data varchar(30000);
    result varchar(100);
    amount pls_integer := 30000;
begin
    -- covert blob to long raw.
    -- amount will hold total bytes read.
    dbms_lob.read(b, amount, 1, lw);
    data := util_raw.rawtohex(lw);
    -- retrieve_embedded retrieves data tagged with tag_code
    -- from internal binary structure by reading hex data
    return retrieve_embedded(data, tag_code);
end;
/

这将适用于大小不超过15Kb的blob。例如,retrieve_embedded函数可以通过执行
substr(数据,1,8)
读取第一个“字节”,通过
将其转换为十进制数(hexdata,'xxxxxxxx')
将其用作偏移量。。。等等。

存储参数在存储和检索相对较小的blob(
对性能的最大影响可能是启用或禁用“行内”存储—这绝对值得尝试。

添加一列MD5,即BLOB数据的MD5校验和。或者,您可以使用相同的主键和MD5列创建一个新表

数据库外部的缓存模块可以利用该列,而不必在缓存命中时两次检索BLOB列

或者,您可以将BLOB数据放到数据库中,并将其存储在文件系统中,文件名为MD5,网络文件服务器为http服务器