如何禁用或删除索引

pau*_*ulH 5 index sql-server sql-server-2008-r2 locking

我在实时服务器 (SQL Server 2008 R2) 上创建了一个非聚集索引,但结果却没有提供我所希望的性能优势。所以我想再次删除索引。

不幸的是,我无法锁定正在使用的索引。它可能总是会被使用。重新启动 SQL Server 并不是一个真正的选择。

过去我想重建索引时也遇到过同样的问题,我不得不通过重新组织来解决这个问题(有时效率很低)。

有没有办法告诉 SQL Server 停止使用索引?或者是否可以运行一个查询来尝试获取索引的排他锁,无限期等待,然后删除索引?还有其他选择吗?或者我是否只需要等到出现某种中断,然后希望我记得在一切恢复联机之前将其删除?

Tho*_*ger 8

有没有办法告诉 SQL 停止使用索引?

这将禁用索引:

alter index IX_YourIndex
on dbo.YourTable
disable;
go
Run Code Online (Sandbox Code Playgroud)

但这也将在高度事务性的对象上遇到并发问题,因为上述操作仍然需要对对象进行模式修改 (Sch-M) 锁定

或者是否可以运行一个查询来尝试获取索引的排他锁,无限期等待,然后删除索引?

这将是 SQL Server 的默认行为。唯一的“命令超时”将由客户端软件强制执行。我将假设您正在使用某种 GUI 来尝试删除/禁用索引(可能是 SSMS?)。无论哪种方式,如果你把它放在一个新的查询窗口 (SSMS) 中,它会无限期地等待锁定的资源变得可用,以便它可以被授予必要的锁定:

drop index IX_YourIndex
on dbo.YourTable;
go
Run Code Online (Sandbox Code Playgroud)

这就是为什么在缓慢的时间或维护窗口期间执行这些类型的操作几乎总是最容易的原因之一。这通常可以确保几乎没有用户活动,使这些简单的任务......简单快捷。

如果您想查看您的删除索引请求正在等待什么/谁,您可以运行类似于以下内容的查询:

select
    session_id,
    command,
    wait_type,
    wait_time,
    blocking_session_id,
    wait_resource
from sys.dm_exec_requests
where command = 'drop index';
Run Code Online (Sandbox Code Playgroud)