装载数据库

第一次装载数据库时可能需要做大量的插入。下面是一些建议,可以尽可能高效地处理这些事情。

关闭自动提交

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

使用COPY

使用COPY在一条命令里加载所有记录, 而不是一连串的INSERT命令。COPY命令是为加载数量巨大的数据行优化过的;它没INSERT那么灵活,但是在大量加载数据的情况下,导致的开销也少很多。因为COPY是单条命令,因此填充表的时候就没有必要关闭自动提交了。

如果你不能使用COPY,那么使用PREPARE来创建一个预备INSERT, 然后使用EXECUTE多次效率更高。这样就避免了重复分析和规划INSERT的开销。

请注意,在加载大量数据行的时候,COPY几乎总是比INSERT快, 即使使用了PREPARE并且把多个INSERT命令绑在一个事务中也是这样。

完成后运行ANALYZE

不管什么时候,如果你在更新了表中的大量数据之后,运行ANALYZE都是个好习惯。 这包括批量加载大量数据到表。运行ANALYZE (或者VACUUM ANALYZE) 可以保证规划器有表数据的最新统计。 如果没有统计数据或者统计数据太陈旧,那么规划器可能选择很差劲的查询规划, 导致统计信息不准确或者不存在的表的性能很差。 请注意如果启动autovacuum守护进程,可能自动运行ANALYZE。

pg_dump的一些注意事项

pg_dump生成的转储脚本自动使用上面的若干个技巧,但不是全部。要尽可能快地加载pg_dump转储,我们需要手工做几个事情。(请注意,这些要点适用于 恢复 一个转储,而不是 创建 一个转储的时候。 同样的要点也适用于使用psql加载一个文本转储或者使用pg_restore从pg_dump 归档文件加载的情况。)

缺省的时候,pg_dump使用COPY,并且在它生成一个完整的包含模式和数据的转储的时候, 它会很小心地先加载数据。这几条技巧是自动处理的,然后在之后运行ANALYZE。