在这个答案中,Erwin Brandstetter 建议
在大量 INSERT / COPY 之前删除索引并在之后重新创建索引也会快得多,因为增量调整每个插入行的索引比立即创建索引的成本要高得多。
1)即使表已经很大,这也是真的吗?如果没有,是否有一种简单的方法来估计收益递减点?例如,我一次将 30,000 条记录复制到一个已经有 1 亿行的表中。每个批次相对较小,但另一方面,目前要导入的总批次将是表大小的两倍以上。
2)如果我要在复制之前删除索引,如果复制是使用已按索引顺序的记录完成的,则重新创建索引会更快吗?
表上只有一个索引,即 5 列主键。
我在非生产机器上执行此操作,并且我已经禁用了 fsync、syncronous_commit、autovacuum 等。我正在 8 核机器上同时从四个单独的进程执行 COPY 操作。我有 12GB 内存,因此如果有帮助的话,我可以将 Maintenance_work_mem 设置为 1GB 或更多。
我的猜测是进行一些基准测试,测量重新创建完整索引所需的时间,插入没有索引和有索引的 10k 行所需的时间。然后我会尝试使用 1000 行、5000 行、10000 行来尝试找出趋势。
因为即使您尝试减少可能影响操作时间的因素(如自动真空),它仍然取决于您的硬件和整个 postgres.conf
奖励:如果您与我们分享一些基准,我们很乐意帮助您找出趋势。