在 SQL Server 中,锁通常是从行或页 -> 表升级的。从 SQL Server 2008 开始,添加了新级别的锁升级 -分区级别。
但是,这不会自动为分区表启用 - 默认情况下,表设置为跳过分区锁定并直接从行或页 -> 表。为什么会这样?有没有理由我不想将所有表从 切换TABLE
到 ,AUTO
以便它们将锁升级到分区级别而不是表级别?
由于默认值仍然是TABLE
,我认为AUTO
.
在 SQL Server 中,锁通常是从行或页 -> 表升级的。从 SQL Server 2008 开始,添加了新级别的锁升级 -分区级别。
但是,这不会自动为分区表启用 - 默认情况下,表设置为跳过分区锁定并直接从行或页 -> 表。为什么会这样?有没有理由我不想将所有表从 切换TABLE
到 ,AUTO
以便它们将锁升级到分区级别而不是表级别?
由于默认值仍然是TABLE
,我认为AUTO
.
BOL有答案——默认情况下它不是 ON,因为它可能会增加死锁的可能性。
数据库引擎不会将行锁或键范围锁升级为页锁,而是将它们直接升级为表锁。同样,页锁总是升级为表锁。在 SQL Server 2008 中,分区表的锁定可以升级到关联分区的 HoBT 级别,而不是表锁定。HoBT 级别的锁不一定会锁定分区的对齐 HoBT。
HoBT 级别的锁通常会增加并发性,但是当锁定不同分区的事务都希望将其排他锁扩展到其他分区时,就会引入死锁的可能性。在极少数情况下,TABLE 锁定粒度可能会执行得更好。