PostgreSQL資料庫匯入大量資料時如何最佳化
在使用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 巧用外部表將大量excel資料匯入資料庫OracleExcel資料庫
- PHP匯入大量CSV資料PHP
- postgresql 資料匯入和匯出SQL
- 如何將Excl內資料匯入資料庫?資料庫
- 資料庫 MySQL 資料匯入匯出資料庫MySql
- 如何用Java將excel資料匯入資料庫JavaExcel資料庫
- 百萬資料如何高效率匯入資料庫資料庫
- 大文字資料,匯入匯出到資料庫資料庫
- 使用navicat匯出查詢大量資料結果集並匯入到其他資料庫(mysql)資料庫MySql
- TP5.1excel匯入資料庫的程式碼?php excel如何匯入資料庫?Excel資料庫PHP
- 100萬資料,如何快速的匯入資料庫?資料庫
- 資料庫的匯入匯出資料庫
- mysql 資料庫匯入匯出MySql資料庫
- MySQL資料庫匯入匯出MySql資料庫
- Sql Server資料庫資料匯入到SQLite資料庫中Server資料庫SQLite
- 在SQL Server資料庫中匯入匯出資料SQLServer資料庫
- 如何將谷歌地球(googleearth)的資料匯入PostgreSQL谷歌GoSQL
- 匯入excel 資料時間Excel
- 資料匯入終章:如何將HBase的資料匯入HDFS?
- Access 匯入 oracle 資料庫Oracle資料庫
- excel 匯入sqlyog資料庫ExcelSQL資料庫
- 將XML匯入資料庫XML資料庫
- 【mysql】資料庫匯出和匯入MySql資料庫
- mysqldump匯入匯出mysql資料庫MySql資料庫
- oracle資料庫匯入匯出命令!Oracle資料庫
- Mysql 資料庫匯入與匯出MySql資料庫
- SQL Server資料庫匯入匯出資料方式比較SQLServer資料庫
- 將informix匯出的文字資料匯入oracle資料庫ORMOracle資料庫
- Postgresql匯出部分資料SQL
- 在SQL Server資料庫中匯入MySQL資料庫Server資料庫MySql
- ORACLE資料庫裡表匯入SQL Server資料庫Oracle資料庫SQLServer
- 匯入excel資源到資料庫Excel資料庫
- 物件及資料存在時的資料匯入(imp)物件
- 如何將資料匯入到 SQL Server Compact Edition 資料庫中SQLServer資料庫
- xml與資料庫中資料的匯入匯出XML資料庫
- NCF 如何匯入Excel資料Excel
- 匯入大量資料,比如300G資料,匯出500G資料需要考慮的問題
- SQLServer 異構資料庫之間資料的匯入匯出SQLServer資料庫