2008R2 无法禁用非聚集索引

jbw*_*ech 6 index sql-server-2008-r2

我们已经确定了一些多余的非聚集索引,我想在直接删除它们之前禁用它们几天。但是,当在 SSMS 中使用 GUI(右键单击 > 禁用)运行 ALTER INDEX DISABLE 时,它显示成功,但索引仍然在线。我似乎无法禁用它。即使在 AW2008R2 中,我也无法禁用索引。帮助!

Aar*_*and 9

您依赖 SSMS 中的图形树图标来指示索引已禁用。根据我的经验,这对于索引来说从来都不是真的(尽管对于某些其他事物,如作业和触发器)。

针对保罗的评论:

不,我不知道他们为什么改变这种行为。

我不知道他们是否按照提问者的建议进行了更改:

我发誓它曾经在树中的索引图标上显示一个小的向下箭头。

除非我们回到 2005 年(我有 2005 个实例,但没有 2005 Management Studio 方便测试)。一方面,他们实际上改善了行为;另一方面,他们让情况变得更糟。让我解释。

在以下屏幕截图中,2012/2014 位于左侧,2008/2008 R2 位于右侧。旧 UI 中关于索引被禁用的视觉提示甚至更少。请注意,树中的索引名称在两个版本中具有相同的视觉和图标表示,即使索引被禁用(点击放大),并且只有 2012/2014 有 Paul 提到的警告:

哥斯拉与摩斯拉第 1 部分

所以,正如我所说,我认为可视化实际上已经有所改进,即使它并不完美 - 我确实倾向于同意应该有一个红色的向下箭头或类似的东西来与 UI 中的其他元素保持一致(你有吗?提交了Connect项目?)。

现在。在较新版本的 SSMS 中情况如何变得更糟?好吧,我找不到在 UI 中重新启用索引的方法。在 2008/2008 R2 中,“选项”选项卡上有一个“使用索引”复选框,该复选框有效 - 尽管我不确定这有多直观。还有一个“重建索引”复选框,它似乎更适合按钮,因为它不是一个选项或属性,但我想这是一个不同的讨论(点击放大):

哥斯拉与摩斯拉第 2 部分

为了验证索引是否真的被禁用,我根本不会使用 UI,而是使用目录视图:

SELECT i.name, i.is_disabled 
  FROM sys.indexes AS i
  INNER JOIN sys.objects AS o
  ON i.[object_id] = o.[object_id]
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
  WHERE s.name = N'dbo' -- or another schema
    AND o.name = N'the table the index belongs to'
    AND i.name = N'the index you disabled';
Run Code Online (Sandbox Code Playgroud)

AND如果要查看表的所有索引,可以省略最后一个。如果要查看数据库中所有禁用的索引,请稍作更改:

SELECT s.name + '.' + o.name, i.name
  FROM sys.indexes AS i
  INNER JOIN sys.objects AS o
  ON i.[object_id] = o.[object_id]
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
  WHERE i.is_disabled = 1;
Run Code Online (Sandbox Code Playgroud)

您也可以右键单击树中的索引,Script Index As > Create To > New Query Editor Window,您应该会看到 - 对于您已禁用的索引 - 索引DISABLE在末尾包含一个脚本,例如:

USE [yourdb]
GO

CREATE INDEX ...
GO

ALTER INDEX [x] ON [dbo].[y] DISABLE
GO
Run Code Online (Sandbox Code Playgroud)