在批量插入表格期间优化索引更新速度

时间:2014-03-22 07:02:33

标签: sql postgresql indexing postgresql-9.1

当将大量数据插入表(来自另一个表,没有特定顺序)时,如何优化多列索引以便以尽可能最快的方式更新索引?

假设索引从未在任何SELECTDELETEUPDATE查询中使用。*还假设列的非重复计数如下(例如):

COLUMN | DISTINCT COUNT
col1   |            634
col2   |          9,923
col3   |          2,357
col4   |              3

*在选择数据时不使用索引的原因是这是主键索引或唯一约束索引。索引已到位,以便违反约束的插入失败。

我已经读过,最具选择性的专栏应该是第一位的。这是正确的,然后是如下创建的索引?

(col2, col3, col1, col4)

如果这是错误的,您如何确定索引中列的最佳顺序,只会在相应的表中看到批量INSERT?目标是在批量INSERT期间加快索引的更新。

2 个答案:

答案 0 :(得分:1)

最快的方法是DROP INDEX,然后在完成插入后执行批量插入和CREATE INDEX

索引的正确结构与列中的值分布没有多大关系,但与检索策略有关,大概只针对UPDATEDELETE,特别是当你对索引的某些但不是所有列进行部分过滤。那些更频繁的过滤器应该首先出现在索引列中。但是,如果是这种情况,您可能想要更彻底地重新考虑索引策略:拥有两个或更多索引以匹配典型的检索策略可能更好。

忽略无知的呼吁:为什么不将索引应用于SELECT语句?索引非常有用 用于从表格中选择数据子集,无论是SELECT还是合格UPDATEDELETE。在这三个操作中的任何一个中使用索引都没有功能上的区别。

OP发表评论后的附录:索引对于许多目的都有用,但它们的维护相对昂贵,随着表格大小的增加,“相对”变得“不可能”。在您的情况下,您必须将源表中的每条记录与目标表中的每条记录或O(m * n)顺序进行比较。即使使用索引,对于大尺寸的表也是行不通的。您最好的选择是删除索引,执行插入,创建不唯一的索引,查找并删除所有重复项,删除索引,最后创建新的唯一索引

答案 1 :(得分:0)

列的顺序对于执行唯一性目的而言并不十分重要。但是,对于某些查询来说,一个唯一索引也不会有用,所以我会命令列来利用它。

为了快速批量插入此索引,我尝试按索引顺序插入。因此,在插入的选择部分添加order by (col2, col3, col1, col4)。这样可以提高IO效率。