↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
历史版本PostgreSQL 7.4 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

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-树索引时,需要对表的现有内容排序。允许归并排序使用更多缓冲页,意味着需要的归并趟数更少。

13.4.5. 之后运行ANALYZE #

每当添加或更新了大量数据之后——包括刚完成表的初次装载之后——运行ANALYZE或VACUUM ANALYZE都是个好主意。这可以确保规划器掌握该表的最新统计信息。如果没有统计信息,或者统计信息已经过时,规划器在生成查询计划时就可能做出糟糕决定,从而导致使用该表的查询性能不佳。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。