2008-10-17 39 views

回答

3

添加一列MD5,它是BLOB數據的MD5校驗和。或者,您可以使用相同的主鍵和MD5列創建一個新表。

在數據庫之外的緩存模塊可以使用該列,而不必在緩存命中中檢索BLOB列兩次。

或者,您可以將BLOB數據放入數據庫中,並將其存儲在文件系統中,將MD5值作爲文件名,並將http服務器用作網絡文件服務器。

2

不知道您的具體要求,我只能提出一些一般性意見。

oracle中的BLOBS並不是最快速的類型。確保你不會在你的設計中構建 許多性能瓶頸,並且儘可能快地運行性能測試 以確保它滿足要求。

dbms_lob是你的朋友。特別是你可能會發現read和substr函數(用於讀取blob的部分)非常有用。

遠離外部C風格的程序 - 它們可能會慢得多。 PL/SQL函數往往要快得多。我不知道Java程序。由於java 引擎更加集成到Oracle中,因此它們可能非常適合使用。可能值得 做一個初步的概念驗證來比較PL/SQL和Java。

使用Java,您將能夠以byte []流的形式讀取數據,並使用Java世界對您的內容進行操作。 Java的外部程序很容易完成 - 您甚至可以僅向Oracle提供Java源代碼。

對於PL/SQL,一個技術,我們已經找到了非常有用的是將BLOB轉換爲原料,強制轉換成 一個varchar,然後將其轉換成十六進制,然後操縱十六進制(串) 標準Oracle字符串函數。 I.e:

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大小的塊。該retrieve_embedded功能可能,例如,可以通過做一個substr(data, 1, 8)讀取第一個「字節」,即轉換通過to_number(hexdata, 'xxxxxxxx')小數使用它作爲補償......等

1

存儲參數可以使相當顯著當涉及到存儲和檢索相對較小的BLOB時(< DB_BLOCK_SIZE * 2左右)。一般來說,您希望將行遷移和行鏈最小化,並儘量減少浪費的空閒空間。

也許對性能的最大影響是啓用或禁用'IN ROW'存儲 - 這絕對值得嘗試。