13.4. 向數據庫中添加記錄

我們第一次填充數據庫時可能需要做大量的表插入。 下面是一些知識和技巧,可以盡可能高效地處理這些事情。

13.4.1. 關閉自動提交

關閉自動提交,並且只在每次(數據拷貝)結束的時候做一次提交。 (在純 SQL 裡,這就意味著在開始的時候發出 BEGIN, 並且在結束的時候執行 COMMIT。有些客戶端的庫可能背著你幹這些事情, 這種情況下你必須確信只有在你要那些庫幹這些事情的時候它才做。) 如果你允許每個插入都獨立地提交,那麼 PostgreSQL 會為所增加的每行記錄做大量的處理。 在一個事務裡完成所有插入的動作的最大的好處就是,如果有一條記錄插入失敗, 那麼,到該點為止的所有已插入記錄都將被回滾,這樣你就不會很難受地面對一個只裝載了一部分數據的表。

13.4.2. 使用COPY FROM

使用 COPY FROM STDIN 以便在一條命令裡裝載所有記錄, 而不是一連串的INSERT命令。 這樣大大減少了分析,規劃等的過荷。 如果你這樣做了,那麼就沒有必要關閉自動提交了,因為這裡只有一條命令。

13.4.3. 刪除索引

如果你正在裝載一個新創建的表,最快的方法是創建表, 用COPY批量裝載,然後創建表需要的任何索引。 在已存在數據的表上創建索引要比遞增地更新所裝載的每一行記錄要快。

如果你對現有表進行增大操作,你可以刪除索引, 裝載表,然後重新創建索引。 當然,在缺少索引的期間,其他數據庫用戶的數據庫性能將有負面的影響。 並且我們在刪除唯一索引之前還需要仔細考慮清楚,因為唯一約束 提供的錯誤檢查在缺少索引的時候會消失.

13.4.4. 增大 sort_mem

在恢復大量的數據的時候,可以臨時增大 sort_mem 配置變量以便改進性能。 這是因為在從零開始創建一個 B-tree 索引地時候,現有的表需要進行排序。 允許融合排序使用更多的緩衝頁面意味著需要少一些的融合回合數。

13.4.5. 事後運行ANALYZE

不管甚麼時候,如果你在增加或者更新了大量數據之後, 運行 ANALYZE 或者 VACUUM ANALYZE 都是個好習慣。這樣就可以保證規劃器有最新的表的數據的統計。 如果沒有統計數據或者統計數據太陳舊,那麼規劃器可能選擇很差勁的查詢規劃,導致檢索你的表的查詢性能的惡化。