2010-03-09 53 views
5

我在寫一個通用的Http資源託管服務,並將大型對象存儲爲Oracle數據庫中的BLOB。我希望能夠在返回存儲對象時設置'Content-Length'頭部,這意味着我需要在開始將其寫入客戶端之前知道BLOB的大小(我知道我可以使用分塊編碼,並且在某些情況下)。有沒有人有任何經驗性能影響調用dbms_lob.getlength()將在每次讀取或我應該計算INSERT上的BLOB大小並將其存儲在表中?平均而言,我希望寫入率高於讀取率。我現在正在編寫一個基準測試,看看它有什麼影響,但似乎是一個我認爲有人可能已經知道的常見問題。此外,使用JDBC/Spring 3,我甚至會如何計算寫入時的BLOB大小? (我不能使用觸發器或存儲過程)謝謝。Oracle Blobs - 存儲大小還是計算?

+1

衡量,衡量,衡量。猜測只是猜測。 – skaffman 2010-03-09 22:16:40

+0

與往常一樣,但有了類似甲骨文(數千人使用)的東西,這似乎是一個非常頻繁的範例,也是許多DBA已經解決的範例。如果有關於它的任何「陷阱」,我想知道。 – Gandalf 2010-03-10 15:44:41

回答

6

我做了一個快速檢查,從表中選擇一個BLOB,然後選擇一個長度(BLOB)和DBMS_LOB.GETLENGTH(BLOB)。 當選擇BLOB本身時,我得到了44個一致的獲取。當我選擇長度(通過任一方法)時,我得到了7個一致的獲取。

基於此,當我得到長度時,它不檢索整個blob並計算長度。假設它存儲在BLOB開始的長度(例如存儲VARCHAR2值的長度)並且直接使用它是明智的。

因此,在推導長度而不是存儲它時不應該有很大的開銷。它也減少了不一致的可能性。

+0

有一個LOB INDEX是一個單獨的段,所以如果你的LOB不能存儲在一行中,它可以快速找到需要使用的塊數。簡而言之,OP在獲取單個LOB時應該同時獲取DBMS_LOB.GETLENGTH(),而不是存儲可能不正確的值。 – 2010-03-10 03:45:29

+0

此外,使用11g,您可以使用虛擬列來提供blob的長度。 – JavaRocky 2010-03-19 07:58:49

0

因爲我沒有看到任何解答..

我沒有親自測量,但我們的DBA推薦存儲它們的大小(我知道,這只是他這樣告訴我)。他雖然不錯,但我個人認爲存儲大小是一種可行的方式 - 至少如果性能至關重要(我們不得不打電話給.length()很多)。

+2

有些DBA會說任何舊的東西。一個好的DBA將能夠敲出一個代碼示例來證明他們的斷言。 – APC 2010-03-10 12:19:53

2

因爲我們BLOBS一般壓縮得很好,我們已經採取了這種做法: -

  • 店的BLOB壓縮。當我們流入BLOB時,在java端進行壓縮。在同一表中的另一列中記錄未壓縮的大小(以字節爲單位)
  • 通過流解壓縮,因爲我們再次發送BLOB,知道內容大小將是

如果你的BLOB是可壓縮的,你可以考慮這種方法。