Postgresql

Postgresql 9 加速索引插入 (JPA)

  • December 14, 2012

我有一個應用程序會生成大量需要快速插入的數據(大約 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中寫了更多關於此的內容。

引用自:https://dba.stackexchange.com/questions/28751