批量插入过程中删除/重建索引

我已经拿到了超过7000万条记录的表格; 我刚刚发现开发人员在批量插入前删除索引,然后在批量插入结束后再次创建。 存储过程的执行时间将近30分钟(请执行drop index,批量插入,然后重新创建索引

建议:这是一个很好的做法,可以从拥有超过70多万记录并每天增加3-4百万记录的表中删除INDEX。

通过在批量插入之前不删除索引来帮助提高性能?

在BIG TABLE中进行BULK插入时要遵循的最佳做法是什么?

感谢致敬


就像SQL Server中的所有内容一样,“It Depends”

在插入过程中维护索引的开销很大,并且在插入之后重建索引时会有开销。 明确确定哪种方法导致更少开销的唯一方法是尝试它们并对其进行基准测试。

如果我是一个赌博的人,我会把我的赌注放在索引的位置上,这样就会完全重建,但我没有完整的画面来进行有根据的猜测。 再一次,要确定的唯一方法就是尝试两种选择。

一个关键的优化是确保您的批量插入是按聚簇键顺序。


如果我正确地阅读你的问题,那么这个表在负载的持续时间内几乎没有限制(锁定),这是一个问题。

如果您的主要目标是增加可用性/减少阻塞,请尝试采用A / B表方法。

A / B方法分解如下:

给定一个名为“MyTable”的表,你实际上有两个物理表(MyTable_A和MyTable_B)和一个视图(MyTable)。

如果MyTable_A包含当前“活动”数据集,则您的视图(MyTable)将从MyTable_A中选择所有列。 同时,您可以在MyTable_B(包含MyTable_A的数据副本以及您正在编写的新数据的副本)上拥有全局信息。一旦MyTable_B被加载,索引并准备就绪,请更新您的“MyTable”视图以指向MyTable_B并截断MyTable_A 。

这种方法假定你愿意增加I / O和存储成本(对你而言是显着的),以保持可用性。 它还假定你的大桌子也相对静止。 如果你遵循这种方法,我会推荐第二个视图,就像MyTable_old指向非活动表(即,如果MyTable_A是当前演示表并由MyTable视图引用,MyTable_old将引用MyTable_B),您将更新MyTable_old视图在同一时间更新MyTable视图。


根据要插入的数据的性质(以及您的SQL Server版本/版本),您也可以利用分区(有关此主题的MSDN博客)。

链接地址: http://www.djcxy.com/p/95677.html

上一篇: Drop/Rebuild indexes during Bulk Insert

下一篇: How often should you rebuild Indexes?