PostgreSQL資料庫匯入大量資料時如何最佳化

T1YSL發表於2022-09-01

在使用PostgreSQL的時候,我們某些時候會往庫裡插入大量資料,例如,匯入測試資料,匯入業務資料等等。本篇文章介紹了在匯入大量資料時的一些可供選擇的最佳化手段。可以結合自己的情況進行選擇。

一、關閉自動提交

關閉自動提交,並且只在每次(資料複製)結束的時候做一次提交。
如果允許每個插入都獨立地提交,那麼PostgreSQL會為所增加的每行記錄做大量的處理。 而且在一個事務裡完成所有插入的動作的最大的好處就是,如果有一條記錄插入失敗, 那麼,到該點為止的所有已插入記錄都將被回滾,這樣就不會面對只有部分資料,資料不完整的問題。

postgres=#  \echo :AUTOCOMMIT
on
postgres=# \set AUTOCOMMIT off
postgres=#  \echo :AUTOCOMMIT
off

二、匯入階段不建立索引,或者匯入階段刪除索引

如果你正匯入一張表的資料,最快的方法是建立表,用COPY批次匯入,然後建立表需要的索引。 在已存在資料的表上建立索引要比遞增地更新表的每一行記錄要快。
如果你對現有表增加大量的資料,可以先刪除索引,匯入表的資料,然後重新建立索引。 當然,在缺少索引的期間,其它資料庫使用者的資料庫效能將有負面的影響。 並且我們在刪除唯一索引之前還需要仔細考慮清楚,因為唯一約束提供的錯誤檢查在缺少索引的時候會消失。( 慎重考慮索引帶來的影響

三、刪除外來鍵約束

和索引一樣,整體地檢查外來鍵約束比檢查遞增的資料行更高效。 所以我們也可以刪除外來鍵約束,匯入表地資料,然後重建約束會更高效。

四、增大maintenance_work_mem

在裝載大量的資料的時候,臨時增大 maintenance_work_mem 可以改進效能。 這個引數也可以幫助加速CREATE INDEX和ALTER TABLE ADD FOREIGN KEY命令。 它不會對COPY本身有很大作用,但是它可以加速建立索引和外來鍵約束。

postgres=# show maintenance_work_mem;
 maintenance_work_mem 
----------------------
 64MB
(1 row)

五、單值insert改多值insert

減少SQL解析的時間。

六、關閉歸檔模式並降低wal日誌級別

當使用WAL歸檔或流複製向一個安裝中錄入大量資料時,在匯入資料結束時,執行一次新的basebackup比執行一次增量WAL更快。
為了防止錄入時的增量WAL,可以將wal_level暫時調整為minimal, archive_modet關閉,max_wal_senders設定為0來禁用歸檔和流複製。 但需修改這些設定需要重啟服務。

postgres=# show wal_level;
 wal_level 
-----------
 minimal
(1 row)
postgres=# show  archive_mode;
 archive_mode 
--------------
 off
(1 row)
postgres=# show max_wal_senders;
 max_wal_senders 
-----------------
 0
(1 row)

七、增大max_wal_size

臨時增大max_wal_size配置變數也可以讓大量資料載入更快。 這是因為向PostgreSQL中載入大量的資料將導致檢查點的發生比平常(由checkpoint_timeout配置變數指定)更頻繁。
發生檢查點時,所有髒頁都必須被刷寫到磁碟上。 透過在批次資料載入時臨時增加max_wal_size,減少檢查點的數目。

postgres=# show max_wal_size;
 max_wal_size 
--------------
 1GB
(1 row)

八、使用copy替代insert

COPY針對批次資料載入進行了最佳化。
COPY命令是為裝載數量巨大的資料行最佳化過的; 它沒INSERT那麼靈活,但是在大量裝載資料的情況下,導致的荷載也少很多。 因為COPY是單條命令,因此填充表的時候就沒有必要關閉自動提交了。

如果不能使用COPY,可以使用PREPARE來建立一個預備INSERT, 然後使用EXECUTE多次效率更高。 這樣就避免了重複分析和規劃INSERT的開銷。

九、禁用觸發器

匯入資料之前先DISABLE掉相關表上的觸發器,匯入完成後重新讓他ENABLE。

ALTER TABLE tab_1 DISABLE TRIGGER ALL; 
匯入資料
ALTER TABLE tab_1 ENABLE TRIGGER ALL;

十、相關導數工具:pg_bulkload

pg_bulkload 是 PostgreSQL 的一個高速資料載入工具,相對於 copy 命令。最大的優勢是速度。 在 pg_bulkload 的直接模式下,它將跳過共享緩衝區和 WAL 緩衝區,直接寫入檔案。它還包括資料恢復功能,可在匯入失敗時進行恢復。
地址:

十一、匯入資料後,使用analyze

執行ANALYZE 或者VACUUM ANALYZE可以保證規劃器有表資料的最新統計。
如果沒有統計資料或者統計資料太陳舊,那麼規劃器可能選擇效能很差的執行計劃,導致表的查詢效能較差。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2913035/,如需轉載,請註明出處,否則將追究法律責任。

相關文章