pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
初次填充数据库时,可能需要做大量的表插入。本节给出一些让这一过程尽可能高效的建议和技巧。
关闭自动提交,只在最后提交一次。(在普通 SQL 中,这意味着开始时发出BEGIN,结束时发出COMMIT。某些客户端库可能会替调用方完成这件事,在这种情况下需要确认它们确实会在所需的时候这样做。)如果允许每次插入都单独提交,PostgreSQL就必须为每条记录的加入执行大量工作。
使用COPY FROM STDIN在一条命令中装载所有记录,而不是使用一系列INSERT命令。这会大幅减少解析、规划等方面的开销。采用这种方法时无须关闭自动提交,因为反正它只是一条命令。
如果正在装载一个新创建的表,最快的方法是先创建表,用COPY批量装载数据,然后再创建该表所需的索引。在已有数据的表上创建索引,要比在每行装载时对索引做增量更新更快。
如果正在向现有表加入大量数据,可以DROP INDEX、装载数据、再重建索引。当然,在索引缺失期间,其他数据库用户的性能可能会受到不利影响。删除唯一索引之前也应慎重考虑,因为唯一约束提供的错误检查会在索引缺失期间丧失。
每当添加或更新了大量数据之后——包括刚完成表的初次装载之后——运行ANALYZE或VACUUM ANALYZE都是个好主意。这可以确保规划器掌握该表的最新统计信息。如果没有统计信息,或者统计信息已经过时,规划器在生成查询计划时就可能做出糟糕决定,从而导致使用该表的查询性能不佳。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。