我在寫一個通用的Http資源託管服務,並將大型對象存儲爲Oracle數據庫中的BLOB。我希望能夠在返回存儲對象時設置'Content-Length'頭部,這意味着我需要在開始將其寫入客戶端之前知道BLOB的大小(我知道我可以使用分塊編碼,並且在某些情況下)。有沒有人有任何經驗性能影響調用dbms_lob.getlength()將在每次讀取或我應該計算INSERT上的BLOB大小並將其存儲在表中?平均而言,我希望寫入率高於讀取率。我現在正在編寫一個基準測試,看看它有什麼影響,但似乎是一個我認爲有人可能已經知道的常見問題。此外,使用JDBC/Spring 3,我甚至會如何計算寫入時的BLOB大小? (我不能使用觸發器或存儲過程)謝謝。Oracle Blobs - 存儲大小還是計算?
回答
我做了一個快速檢查,從表中選擇一個BLOB,然後選擇一個長度(BLOB)和DBMS_LOB.GETLENGTH(BLOB)。 當選擇BLOB本身時,我得到了44個一致的獲取。當我選擇長度(通過任一方法)時,我得到了7個一致的獲取。
基於此,當我得到長度時,它不檢索整個blob並計算長度。假設它存儲在BLOB開始的長度(例如存儲VARCHAR2值的長度)並且直接使用它是明智的。
因此,在推導長度而不是存儲它時不應該有很大的開銷。它也減少了不一致的可能性。
有一個LOB INDEX是一個單獨的段,所以如果你的LOB不能存儲在一行中,它可以快速找到需要使用的塊數。簡而言之,OP在獲取單個LOB時應該同時獲取DBMS_LOB.GETLENGTH(),而不是存儲可能不正確的值。 – 2010-03-10 03:45:29
此外,使用11g,您可以使用虛擬列來提供blob的長度。 – JavaRocky 2010-03-19 07:58:49
因爲我沒有看到任何解答..
我沒有親自測量,但我們的DBA推薦存儲它們的大小(我知道,這只是他這樣告訴我)。他雖然不錯,但我個人認爲存儲大小是一種可行的方式 - 至少如果性能至關重要(我們不得不打電話給.length()很多)。
有些DBA會說任何舊的東西。一個好的DBA將能夠敲出一個代碼示例來證明他們的斷言。 – APC 2010-03-10 12:19:53
因爲我們BLOBS一般壓縮得很好,我們已經採取了這種做法: -
- 店的BLOB壓縮。當我們流入BLOB時,在java端進行壓縮。在同一表中的另一列中記錄未壓縮的大小(以字節爲單位)
- 通過流解壓縮,因爲我們再次發送BLOB,知道內容大小將是
如果你的BLOB是可壓縮的,你可以考慮這種方法。
- 1. Postgresql和BLOBs - bytea的最大大小?
- 2. 計算列或存儲過程還是隻需要php函數?
- 3. 雲計算按小時還是按分鐘運行@雲計算?
- 4. 存儲文件大小與每次計算文件大小的效率?
- 5. 計算隔離存儲器中文件的大小
- 6. OpenCL的本地存儲器大小和計算單元
- 7. C++計算大小
- 8. Appwidget大小計算
- 9. 計算和緩存文件夾大小
- 10. 內存單元,計算大小,幫助!
- 11. Oracle計算實際使用大小和統計信息收集
- 12. 估計服務器存儲的大小
- 13. 在Oracle中存儲大數
- 14. git:dangling blobs
- 15. ODBC存儲大小
- 16. 有更多的小型Azure存儲blob容器(每個都有一些blob)還是一個非常大的容器有大量blobs?
- 17. Oracle大單更新還是小批量更新?
- 18. 位圖行大小計算
- 19. InfiniDB表大小計算
- 20. 計算陣列的大小
- 21. 計算數組的大小
- 22. 計算字體大小
- 23. 計算數組的大小
- 24. iphone - 計算字體大小
- 25. 計算硬盤大小
- 26. 視頻大小計算
- 27. 計算數組大小
- 28. 放大和縮小計算
- 29. ScriptDB對象大小計算
- 30. 計算字體大小
衡量,衡量,衡量。猜測只是猜測。 – skaffman 2010-03-09 22:16:40
與往常一樣,但有了類似甲骨文(數千人使用)的東西,這似乎是一個非常頻繁的範例,也是許多DBA已經解決的範例。如果有關於它的任何「陷阱」,我想知道。 – Gandalf 2010-03-10 15:44:41