为什么索引重建需要 Sch-M 锁?

Kim*_*imo 4 sql-server database-internals index-maintenance

我不明白为什么索引重建需要对给定索引使用 Sch-M 锁。

Pau*_*ite 10

How Online Index Operations Work的文档说:

SCH-M (架构修改)如果任何源结构(索引或表)被删除。*

* 在获取表上的 S 锁或 SCH-M 锁之前,索引操作会等待任何未提交的更新事务完成。

那是专门用于在线操作的。如果你问的是离线操作,逻辑是一样的:没有任何东西可以访问即将被删除的结构,甚至不能访问,甚至不能访问Sch-S系统事务内部的内部使用。还要注意那里的“(索引或表)”,所以这适用于所有索引(包括集群)和堆表。

前段时间,Sch-M在创建索引视图时应用了限制。指出这是不必要的(连接链接不再可用),因为没有删除结构,只创建了结构,因此行为已更改(仅采用Sch-STab-S)。

也与文档相关:

ALTER TABLE获取表上的模式修改 ( SCH-M) 锁,以确保在更改期间没有其他连接引用该表的元数据...

在同一链接中,SQL Server 2012 引入了添加NOT NULL列的功能,Sch-M只要默认值为运行时常量即可。我提到这一点是因为它展示了 SQL Server 如何发展以尽可能减少不必要的限制性锁定。如果您发现您认为Sch-M确实没有必要的特定情况,您可以在Microsoft 反馈站点上提出建议。

此外,在Unicorns、rainbows 和在线索引操作中,Paul Randal 说:

当索引操作完成时,就更新而言,新旧索引处于锁步状态。完成操作需要模式修改锁(SCH_M 锁模式)。您可以将其视为超级表 X 锁——它需要增加表的主版本号——不能在表上运行任何操作,并且在持有锁时不能编译任何计划。

相关链接: