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-S
和Tab-S
)。
也与文档相关:
ALTER TABLE
获取表上的模式修改 (SCH-M
) 锁,以确保在更改期间没有其他连接引用该表的元数据...
在同一链接中,SQL Server 2012 引入了添加NOT NULL
列的功能,Sch-M
只要默认值为运行时常量即可。我提到这一点是因为它展示了 SQL Server 如何发展以尽可能减少不必要的限制性锁定。如果您发现您认为Sch-M
确实没有必要的特定情况,您可以在Microsoft 反馈站点上提出建议。
此外,在Unicorns、rainbows 和在线索引操作中,Paul Randal 说:
当索引操作完成时,就更新而言,新旧索引处于锁步状态。完成操作需要模式修改锁(SCH_M 锁模式)。您可以将其视为超级表 X 锁——它需要增加表的主版本号——不能在表上运行任何操作,并且在持有锁时不能编译任何计划。
相关链接: