1. 程式人生 > >postgresql優化資料的批量插入

postgresql優化資料的批量插入

有以下幾種方法用於優化資料的批量插入。

1. 關閉自動提交:
    在批量插入資料時,如果每條資料都被自動提交,當中途出現系統故障時,不僅不能保障本次批量插入的資料一致性,而且由於有多次提交操作的發生,整個插入效率也會受到很大的打擊。解決方法是,關閉系統的自動提交,並且在插入開始之前,顯式的執行begin transaction命令,在全部插入操作完成之後再執行commit命令提交所有的插入操作。

2. 使用COPY:
    使用COPY在一條命令裡裝載所有記錄,而不是一系列的INSERT命令。COPY命令是為裝載數量巨大的資料行優化過的,它不像INSERT命令那樣靈活,但是在裝載大量資料時,系統開銷也要少很多。因為COPY是單條命令,因此在填充表的時候就沒有必要關閉自動提交了。


3. 刪除索引:
    如果你正在裝載一個新建立的表,最快的方法是建立表,用COPY批量裝載,然後建立表需要的任何索引。因為在已存在資料的表上建立索引比維護逐行增加要快。當然在缺少索引期間,其它有關該表的查詢操作的效能將會受到一定的影響,唯一性約束也有可能遭到破壞。

4. 刪除外來鍵約束:
    和索引一樣,"批量地"檢查外來鍵約束比一行行檢查更加高效。因此,我們可以先刪除外來鍵約束,裝載資料,然後再重建約束。

5. 增大maintenance_work_mem:
    在裝載大量資料時,臨時增大maintenance_work_mem系統變數的值可以改進效能。這個系統引數可以提高CREATE INDEX命令和ALTER TABLE ADD FOREIGN KEY命令的執行效率,但是它不會對COPY操作本身產生多大的影響。


6. 增大checkpoint_segments:
    臨時增大checkpoint_segments系統變數的值也可以提高大量資料裝載的效率。這是因為在向PostgreSQL裝載大量資料時,將會導致檢查點操作(由系統變數checkpoint_timeout宣告)比平時更加頻繁的發生。在每次檢查點發生時,所有的髒資料都必須flush到磁碟上。通過提高checkpoint_segments變數的值,可以有效的減少檢查點的數目。

7. 事後執行ANALYZE:
    在增加或者更新了大量資料之後,應該立即執行ANALYZE命令,這樣可以保證規劃器得到基於該表的最新資料統計。換句話說,如果沒有統計資料或者統計資料太過陳舊,那麼規劃器很可能會選擇一個較差的查詢規劃,從而導致查詢效率過於低下。