2015-09-26 57 views
0

我的應用程序需要在Postgres數據庫中存儲數百萬個二進制塊(每秒可能會有幾千個二進制塊)。大多數塊的大小是16K,儘管有些可能更小。我知道我可以使用文本,bytea或blob列,或者我可以將二進制數據存儲在數據庫外的文件中,並將它們的路徑放在表中。用於在PostgreSQL中存儲16K二進制塊的適當列類型

考慮到高吞吐量是我最重要的目標,哪個選項最適合我的情況呢?

+0

參見如果這些塊是可壓縮(即已經重複的值),然後'bytea'可能是因爲它壓縮數據是一個不錯的選擇。但我同意湯姆的觀點:你必須爲自己測試性能,這是不可能以「一般」方式回答的。我個人會首先測試'bytea'解決方案,看看它是否可以支持性能要求 –

+0

基準測試不同的接近度當然是我的議程。我只是想知道那些我不知道的衆所周知的事實。 – Elektito

回答

1

bytea這裏是明智的選擇 - 幾乎是唯一的選擇。

沒有使用textvarchar等的優點不要在其中存儲編碼的二進制文件。這是一個你應該馬上忽略的選項。

PostgreSQL中沒有blob類型。我認爲你的意思可能是lob,這是oid的包裝,用於在pg_largeobject表中查找「大對象」。當你需要在數據庫中尋找,覆蓋,追加等數據的虛擬「文件」時,這非常有用,但它完全不適合你的用例。

可以店的路徑或文件名,然後看看他們在外部,但你將有很小的文件很多。你還需要一個sidechannel來讓客戶讀取和寫入它們,因爲你不能直接使用PostgreSQL協議。您需要分別處理備份/恢復和複製。如果事務回滾或者相應的數據庫元組被刪除,它們將不會被刪除,因此您需要清理系統來刪除不再需要的文件。它會變得混亂。當文件很大,很長時間,大多數是靜態的時候,這是值得的,但這聽起來不像是你的情況。

將二進制文件直接存儲在bytea列中,最好使用PgJDBC或libpq中的二進制協議支持在客戶端和服務器之間交換bytea值而不需要編碼。在您寫入的表上有最小的索引。 (在某些情況下,你甚至可以不定義主鍵,但這是一種專家級選項)。如果您不介意在計劃外重新啓動時丟失表中的數據,請使用未記錄的表。否則,批量寫入並使用異步提交和/或提交延遲。

How to speed up insertion performance in PostgreSQL

+0

這正是我正在尋找的答案。謝謝。關於在libpq中使用二進制協議支持,是否可以使用'PQexecParams'並在'paramFormats'中請求二進制格式? – Elektito

+0

@Elektito是的,這是很好的閱讀。對於編寫,你必須爲你的查詢參數指定一個參數格式數組 –

0

嘗試所有選項,對它們進行基準測試,並找出哪一個最適合您。

相關問題