原文:
http://www.cnblogs.com/mchina/archive/2012/08/11/2537393.html
有以下幾種方法用于優化數據的批量插入。
?? ?
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命令,這樣可以保證規劃器得到基于該表的最新數據統計。換句話說,如果沒有統計數據或者統計數據太過陳舊,那么規劃器很可能會選擇一個較差的查詢規劃,從而導致查詢效率過于低下。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
