我有一个经常性的工作,它从模板创建一个 Postgres (v11) 数据库并用数据加载它。数据的规模大约为 10 或 100 几百万行,因此出于性能原因,我在创建任何主键或索引之前批量插入数据。这是我目前的操作顺序:
- 创建表
- 批量
COPY
处理所有数据 - 创建主键
- 创建附加索引
创建主键和索引是此工作流程中最慢的部分。当通过 ANALYZE/VACUUM/REINDEX 重新计算统计数据会有帮助甚至是必要的时候,这个工作流程有什么意义吗?
我有一个经常性的工作,它从模板创建一个 Postgres (v11) 数据库并用数据加载它。数据的规模大约为 10 或 100 几百万行,因此出于性能原因,我在创建任何主键或索引之前批量插入数据。这是我目前的操作顺序:
COPY
处理所有数据创建主键和索引是此工作流程中最慢的部分。当通过 ANALYZE/VACUUM/REINDEX 重新计算统计数据会有帮助甚至是必要的时候,这个工作流程有什么意义吗?
为了加快索引创建,增加
maintenance_work_mem
.此外,您可以提高
max_wal_size
以减少检查点的数量。如果您根本不需要崩溃恢复(即,您很乐意在发生崩溃的情况下重新创建数据库),您可以使用未记录的表来提高性能。您可能应该在步骤 2.5 中执行 VACUUM。如果您将其作为第 5 步执行,或者允许 autovac 隐式执行(作为第 5 步+某事),那么您将无用地清理不需要它的索引。
如果任何索引是表达式索引,则应按照步骤 5 进行分析。否则,将步骤 2.5 设为 VACUUM ANALYZE。表达式索引有自己收集的统计信息,但当然,如果在分析时它们不存在,那是行不通的。