ALTER TABLE获取表上的模式修改 ( SCH-M) 锁,以确保在更改期间没有其他连接引用甚至表的元数据...
在同一个链接中,SQL Server 2012 引入了添加NOT NULL列的功能,Sch-M只要默认值为运行时常量即可。我提到这一点是因为它显示了 SQL Server 如何发展以尽可能减少不必要的限制性锁定。如果您发现某个特定情况Sch-M确实没有必要,您可以在Microsoft 反馈站点上提出建议。
在index rebuild(online或offline) 的情况下,将构建 an 的新副本,并删除index旧的。index在删除旧索引之前,需要更新表元数据。
所以在索引重建的最后阶段,Sch-M锁被用来替换metadata.
更新
回复评论
在线添加(不是重建!)一个新的非聚集索引不需要 Sch-M。– 保罗·怀特
好的。这是我的新复制品:
use tempdb;
go
create table dbo.t (id int);
insert into dbo.t values (1);
go
begin tran;
create index IX_t on dbo.t (id) with (online = on);
select l.request_mode,
l.resource_type,
l.resource_subtype,
l.resource_associated_entity_id,
object_name(p.object_id),
p.index_id
from sys.dm_tran_locks l
left join sys.partitions p
on p.hobt_id = l.resource_associated_entity_id
where l.request_session_id = @@spid and l.request_mode = N'Sch-M';
commit;
go
How Online Index Operations Work的文档说:
那是专门针对在线操作的。如果你问的是离线操作,逻辑是一样的:没有什么可以访问一个即将被删除的结构,甚至不能
Sch-S
只在系统事务中使用,也不能在系统事务中使用。还要注意那里的“(索引或表)”,因此这适用于所有索引(包括聚集)和堆表。前段时间,
Sch-M
在创建索引视图时应用了限制。这被指出是不必要的(连接链接不再可用),因为没有结构被删除,只是被创建,所以行为被改变了(只接受Sch-S
和Tab-S
)。也与文档相关:
在同一个链接中,SQL Server 2012 引入了添加
NOT NULL
列的功能,Sch-M
只要默认值为运行时常量即可。我提到这一点是因为它显示了 SQL Server 如何发展以尽可能减少不必要的限制性锁定。如果您发现某个特定情况Sch-M
确实没有必要,您可以在Microsoft 反馈站点上提出建议。此外,在Unicorns、rainbows 和在线索引操作中,Paul Randal 说:
相关链接:
当发生任何元数据更改时,将获取模式修改 (
Sch-M
) 锁。在
index rebuild
(online
或offline
) 的情况下,将构建 an 的新副本,并删除index
旧的。index
在删除旧索引之前,需要更新表元数据。所以在索引重建的最后阶段,
Sch-M
锁被用来替换metadata
.更新
回复评论
好的。这是我的新复制品: