我有表,其中有超过7000万条记录;我刚刚发现,开发人员在大容量插入之前删除索引,然后在大容量插入结束后再次创建。存储过程的执行时间将近30分钟(执行删除索引,执行大容量插入,然后从头开始重新创建索引)。
建议:这是一个很好的做法,把INDEX从桌子上删除,因为INDEX有超过70+百万的记录,每天增加300万到400万。
在大容量插入之前不删除索引有助于提高性能吗?
在大表中执行大容量插入时应遵循的最佳做法是什么。
感谢并致以问候
发布于 2011-08-05 16:40:54
就像Server中的一切一样,“它取决于”
在insert期间维护索引有开销,在insert之后重建索引也有开销。确定哪种方法开销较小的唯一方法是同时尝试它们并对它们进行基准测试。
如果我是个下注的人,我会下注,如果把指数留在原地,就会让整个重建工作泡汤,但我没有足够的时间来做一个有根据的猜测。同样,唯一确定的方法就是尝试这两种选择。
一个关键优化是确保批量插入是按群集密钥顺序进行的。
如果我正确地阅读了您的问题,那么在加载期间,该表基本上是禁止使用的(锁定的),这是一个问题。
如果您的主要目标是增加可用性/减少阻塞,请尝试采用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视图的同时更新MyTable_old视图。
根据要插入的数据的性质(以及Server版本/版本),还可以利用分区(MSDN关于这个主题的博客。)
https://stackoverflow.com/questions/6955456
复制相似问题