Postgresql
Postgresql 9 加速索引插入 (JPA)
我有一個應用程序會生成大量需要快速插入的數據(大約 1300 萬條記錄)。我將 JPA 2.0/Hibernate 與 Postgres 9.1 一起使用,並且通過多執行緒和每幾千次左右的插入批處理插入,我設法實現了相當好的性能(每秒大約 25k 次插入),在大約 8 分鐘內完成了整個執行。
但是,我注意到我有一些缺少索引的外鍵,從分析的角度來看,我真的希望既能深入研究數據,又能刪除特定執行的數據。不幸的是,當我將這 3 個索引添加到插入最多的表中時,性能急劇下降到每秒 3k 左右。
有什麼辦法可以避免這種性能變慢?我知道一種選擇是在執行之前刪除索引並在最後重新創建它們。另一個更笨拙的選擇是在文件中生成最大表的數據並使用
COPY
. 我想我只能在關係中最大的表上執行此操作,因為我需要知道外鍵值(通過序列生成)。這兩種選擇似乎都是黑客。是否有任何其他解決方案,可能對應用程序的干擾較小?一些設置告訴 postgres 推遲索引或類似的東西?
歡迎任何想法。
延遲索引會很好,但目前不支持。
添加索引具有成本寫入性能。他們是一個權衡。
COPY
如果索引維護是主要問題,那將無濟於事。最簡單的解決方案是刪除索引,並在完成導入後重新創建它們。
由於如果數據庫崩潰,您可以忍受失去所有數據,因此您有很多選項可以進一步提高性能,包括:
- 未記錄的表
fsync=off
- 託管數據庫的驅動器上的非持久磁碟寫入記憶體
如果出現任何問題,使用上述任何一種方法都會消耗您的數據。最後一個選項也可能會吃掉文件系統。
我在https://stackoverflow.com/questions/9407442/optimise-postgresql-for-fast-testing中寫了更多關於此的內容。