禁用并重新启用SQL Server数据库中的所有索引

Era*_*eir 25 sql-server sql-server-2005

我正在运行DTS来在我的数据库中执行任务,其中首先我需要禁用数据库中的所有索引,并在DTS完成其工作时重新启用它们.

有没有办法可以禁用整个数据库中的所有索引,然后重新启用它们?

我知道如何逐个禁用/启用,有人可以帮助我在DTS中一次禁用/启用所有功能.

小智 34

这是一个脚本,它将为数据库中的所有非聚簇索引输出ALTER语句.您可以轻松地修改它以输出聚簇索引的REBUILD脚本和脚本

select 'ALTER INDEX [' + I.name + '] ON [' + T.name + '] DISABLE' 
from sys.indexes I
inner join sys.tables T on I.object_id = T.object_id
where I.type_desc = 'NONCLUSTERED'
and I.name is not null
Run Code Online (Sandbox Code Playgroud)

  • 你可能意味着REBUILD而不是ENABLE? (2认同)

Rah*_*arg 27

我们可以使用下面的脚本来禁用索引

ALTER INDEX ALL ON [TableName]
DISABLE;
Run Code Online (Sandbox Code Playgroud)

将批量插入到表中,然后在脚本下面运行.

ALTER INDEX ALL ON [TableName]
REBUILD;
Run Code Online (Sandbox Code Playgroud)

  • 它不能完全解决OP的问题,但我喜欢它,它也很有帮助。 (3认同)
  • 这既简单又有效,但对于到达此线程的任何想要进行有条件批量更新或删除的人(像我一样),这将禁用您的主键并破坏您的性能。您可能只想禁用非聚集索引,并且根据您的条件,最好同时保持一些非聚集索引处于活动状态。 (2认同)

小智 26

这适用于SQL Server 2008和更新版本.它允许不同的模式以及具有空格,短划线和必须引用的其他特殊字符的名称.在sql语句中使用方括号[]有什么用?

这些脚本将代码输出到结果选项卡中.您必须复制/粘贴到查询选项卡并执行它们.

禁用脚本

SELECT 'ALTER INDEX ' + QUOTENAME(I.name) + ' ON ' +  QUOTENAME(SCHEMA_NAME(T.schema_id))+'.'+ QUOTENAME(T.name) + ' DISABLE' 
FROM sys.indexes I
INNER JOIN sys.tables T ON I.object_id = T.object_id
WHERE I.type_desc = 'NONCLUSTERED'
AND I.name IS NOT NULL
AND I.is_disabled = 0
Run Code Online (Sandbox Code Playgroud)

启用脚本(重建)

SELECT 'ALTER INDEX ' + QUOTENAME(I.name) + ' ON ' +  QUOTENAME(SCHEMA_NAME(T.schema_id))+'.'+ QUOTENAME(T.name) + ' REBUILD' 
FROM sys.indexes I
INNER JOIN sys.tables T ON I.object_id = T.object_id
WHERE I.type_desc = 'NONCLUSTERED'
AND I.name IS NOT NULL
AND I.is_disabled = 1
Run Code Online (Sandbox Code Playgroud)

这是基于另一个答案.


小智 5

要启用索引,您必须重建它.此脚本将重建所有已禁用的索引.

DECLARE @my_sql2 NVARCHAR(200);

DECLARE cur_rebuild CURSOR FOR 
   SELECT 'ALTER INDEX ' +  i.name + ' ON ' + t.name + ' REBUILD' FROM sys.indexes i JOIN sys.tables t ON i.object_id = t.object_id WHERE i.is_disabled = 1 ORDER BY t.name, i.name;
OPEN cur_rebuild;
FETCH NEXT FROM cur_rebuild INTO @my_sql2;
WHILE @@FETCH_STATUS = 0
   BEGIN
      EXECUTE sp_executesql  @my_sql2;
      FETCH NEXT FROM cur_rebuild INTO @my_sql2;
   END;
CLOSE cur_rebuild;
DEALLOCATE cur_rebuild;
GO
Run Code Online (Sandbox Code Playgroud)