10.4. 向数据库中添加记录

我们第一次填充数据库时可能需要做大量的表插入。 下面是一些知识和技巧,可以尽可能高效地处理这些事情。

10.4.1. 关闭自动提交

关闭自动提交,并且只在每次(数据拷贝)结束的时候做一次提交。 (在纯 SQL 里,这就意味着在开始的时候发出 BEGIN, 并且在结束的时候执行 COMMIT.有些客户端的库 可能背着你干这些事情,这种情况下你必须确信只有在你要那些库干这些 事情的时候它才做.) 如果你允许每个插入都独立地提交,那么 PostgreSQL 会为所增加的每条记录做大量的处理. 在一个事务里完成所有插入的动作的最大的好处就是,如果有一条记录 插入失败,那么,到该点为止的所有已插入记录都将被回滚,这样你就 不会很难受地面对一个只装载了一部分数据地表。

10.4.2. 使用 COPY FROM

使用 COPY FROM STDIN 以便在一条命令里装载所有记录, 而不是一连串的INSERT命令。 这样大大减少了分析,规划等的过荷。 如果你这样做了,那么就没有必要关闭自动提交了。

10.4.3. 删除索引

如果你正在装载一个新创建的表,最快的方法是创建表, 用COPY批量装载,然后创建表需要的任何索引。 在已存在数据的表上创建索引要比递增地更新所装载的每一行记录要快。

如果你对现有表进行操作,你可以 DROP INDEX, 装载表,然后重新创建索引。 当然,在缺少索引的期间,其他数据库用户的数据库性能将有负面的影响。 并且我们在删除唯一索引之前还需要仔细考虑清楚,因为唯一约束 提供的错误检查在缺少索引的时候会消失.

10.4.4. 事后运行 ANALYZE

不管甚么时候,如果你在增加或者更新了大量数据之后, 运行 ANALYZE 或者 VACUUM ANALYZE 都是个好习惯.这样就可以保证规划器有最新的表的数据的统计. 如果没有统计数据或者统计数据太陈旧,那么规划器可能选择很差劲的 查询计划,导致检索你的表的查询性能的恶化.