是否可以重建已删除的索引?

Rac*_*SQL 4 performance sql-server sql-server-2014 bulk-insert query-performance

是否可以删除和索引并重建它,而不是禁用它并重建?

Mar*_*ith 12

我同意“正确答案”不正确。

您不能rebuild删除已删除的索引,您将需要create再次使用它们,并且无论如何在删除和创建索引之后进行插入都是没有意义的。

我认为正确的答案实际上是这样的

  1. 禁用非聚集索引。
  2. 做插入
  3. 重建非聚集索引。

由于这是一个堆,因此可以使用

  1. ALTER INDEX ALL ON OrdersHistory DISABLE
  2. INSERT ...
  3. ALTER INDEX ALL ON OrdersHistory REBUILD

与其他可能的替代方案(例如您建议的删除和重新创建所有索引的解决方案)相比,这对现有权限的影响为零,并且管理工作量低。


Sol*_*zky 5

提议的解决方案没有多大意义,因为:

  1. 调用ALTER INDEX ALL堆没有效果;对于堆,它只影响非聚集索引,在建议的解决方案中不再存在任何非聚集索引。即使这个表有一个在删除所有索引的步骤中被删除的聚集索引,它也会是一个堆。正如ALTER INDEX的 MSDN 页面所述:

    如果指定了 ALL 并且基础表是堆,则重建操作对表没有影响。与该表关联的任何非聚集索引都将重建。

    在这种情况下,ALTER INDEX ALL ... REBUILD操作绝对不会做任何事情,但也不会抛出错误。

    如果 的目的ALTER INDEX ALL ... REBUILD是释放未使用的数据页(由于该表是堆,可能需要这样做),那么它仍然没有意义,因为这只发生在ALTER TABLE ... REBUILD(我测试了两个命令)。

  2. 永远不会重新创建索引。这似乎有点不负责任;-)

  3. @Martin 在他的回答中提到的一切

  4. 关于 的要求minimal administrative effort,@Martin 的回答涵盖了这方面的操作方面,但另一方面,它可以通过比删除和创建索引所需的更细粒度的权限来完成。根据ALTER INDEX(上面链接)的 MSDN 页面:

    要执行 ALTER INDEX,至少需要对表或视图具有 ALTER 权限。

基本上,建议的解决方案是:

  1. 可能需要额外的权限
  2. 做一堆工作(即删除索引)
  3. 执行命令什么也不做(即ALTER INDEX ALL ... REBUILD
  4. 走开,让其他人浪费时间寻找查询运行速度比平时慢的原因,完全期望这些索引就位,因此可能不是他们可能检查的第一个位置。但即使他们弄明白了,仍然需要有人去查找该表的最新索引定义。

这是相当奇怪的建议。我会坚持马丁提出的答案;-)。