我被要求將查詢能力添加到充滿大部分二進制數據的數據庫(Oracle)中。 所以我需要能夠查詢幾千字節塊內的二進制範圍。我從來沒有這樣做過,所以我想知道在開始這樣一個項目時有什麼好的做法和缺陷需要考慮。從數據庫查詢二進制數據的一些最佳實踐是什麼?
謝謝
我被要求將查詢能力添加到充滿大部分二進制數據的數據庫(Oracle)中。 所以我需要能夠查詢幾千字節塊內的二進制範圍。我從來沒有這樣做過,所以我想知道在開始這樣一個項目時有什麼好的做法和缺陷需要考慮。從數據庫查詢二進制數據的一些最佳實踐是什麼?
謝謝
添加一列MD5,它是BLOB數據的MD5校驗和。或者,您可以使用相同的主鍵和MD5列創建一個新表。
在數據庫之外的緩存模塊可以使用該列,而不必在緩存命中中檢索BLOB列兩次。
或者,您可以將BLOB數據放入數據庫中,並將其存儲在文件系統中,將MD5值作爲文件名,並將http服務器用作網絡文件服務器。
不知道您的具體要求,我只能提出一些一般性意見。
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')
小數使用它作爲補償......等
存儲參數可以使相當顯著當涉及到存儲和檢索相對較小的BLOB時(< DB_BLOCK_SIZE * 2左右)。一般來說,您希望將行遷移和行鏈最小化,並儘量減少浪費的空閒空間。
也許對性能的最大影響是啓用或禁用'IN ROW'存儲 - 這絕對值得嘗試。