我在实时服务器 (SQL Server 2008 R2) 上创建了一个非聚集索引,结果证明并没有带来我所希望的性能优势。所以我想再次删除索引。
不幸的是,我无法锁定正在使用的索引。它可能总是会被使用。重新启动 SQL Server 并不是一个真正的选择。
过去,当我想重建索引时,我也遇到过同样的问题,我不得不通过重新组织来解决这个问题(这有时效率很低)。
有没有办法告诉 SQL Server 停止使用索引?或者是否可以运行一个查询来尝试获取索引的排他锁,无限期地等待,然后删除索引?还有其他选择吗?还是我只需要等到出现某种中断,然后希望我记得在一切恢复在线之前将其删除?
那将禁用索引:
但这也将在高度事务性对象上遇到并发问题,因为上述操作仍然需要对象上的模式修改 (Sch-M) 锁。
这将是 SQL Server 的默认行为。唯一的“命令超时”将由客户端软件强制执行。我将假设您正在使用某种 GUI 来尝试删除/禁用索引(可能是 SSMS?)。无论哪种方式,如果您将其放在新的查询窗口 (SSMS) 中,它将无限期地等待锁定的资源变得可用,以便可以授予它必要的锁定:
这就是为什么在缓慢的时间或维护窗口中执行这些类型的操作几乎总是最容易的原因之一。这通常可以确保几乎没有用户活动,使这些简单的任务......简单快捷。
如果您想查看您的删除索引请求正在等待什么/谁,您可以运行类似于以下的查询: