Sql server SQL Server锁升级问题

Sql server SQL Server锁升级问题,sql-server,locking,escalation,Sql Server,Locking,Escalation,我正在从中读取SQL Server锁升级 我的问题是,锁升级的主要原因似乎是为了减少维护更多锁的开销(例如,当为一个表获取了更多行锁时,行级锁升级到表级)。我的问题是,维护更多的锁将提高并发性,这是一个好处,为什么这是一个开销?根据我的拙见,锁应该小到足以通过提高并发性来提高数据库性能。谁能简单地解释一下为什么需要锁升级,以及所谓的锁开销是什么 提前感谢,, George锁开销意味着管理一个表锁比管理许多行锁性能更好。由于每个锁占用一些内存,因此许多行锁可能比一个表锁占用更多内存。 因此,锁升级

我正在从中读取SQL Server锁升级

我的问题是,锁升级的主要原因似乎是为了减少维护更多锁的开销(例如,当为一个表获取了更多行锁时,行级锁升级到表级)。我的问题是,维护更多的锁将提高并发性,这是一个好处,为什么这是一个开销?根据我的拙见,锁应该小到足以通过提高并发性来提高数据库性能。谁能简单地解释一下为什么需要锁升级,以及所谓的锁开销是什么

提前感谢,,
George

锁开销意味着管理一个表锁比管理许多行锁性能更好。由于每个锁占用一些内存,因此许多行锁可能比一个表锁占用更多内存。
因此,锁升级从行->页面->表锁开始。

如果SQL Server Optimizer估计/决定查询将“访问”某个范围内的所有行,则在该范围内持有单个锁将比协商多个锁(锁必须进行类型测试)更有效。这是除了消耗更少的锁资源(系统范围的资源)之外的

如果您有一个设计良好的模式,并且索引适合于您的查询工作负载(这些工作负载是定期维护的),那么您就不必担心正在发生的升级。在许多情况下,可以通过适当的覆盖索引消除阻塞表锁

更新:查询的覆盖索引意味着不需要执行对聚集表的查找,这减少了阻止插入表的机会。

高效”的定义很复杂。有时,如果许多进程可以在没有冲突的情况下完成这些工作,那么优化并发性会更有效。有时,为了更快地完成单个进程,进行临时并发操作更有效。升级的锁将阻止其他进程,以便此进程可以完成其工作并避开阻碍

谁能简单地解释一下为什么需要锁升级,以及所谓的锁开销是什么

当您更新一个表并锁定一行时,您需要以某种方式记录这一事实:这是一行,它已被更新并锁定

当您更新一百万行时,您需要执行一百万次,因此有一些空间来保存一百万个锁

SQL Server在内存中保留一个锁列表,而Oracle在表空间中保留锁列表

这可能是因为Oracle很老(比我老),而SQL Server比Oracle还年轻

从设计师的角度来看,将临时资源(如锁)保存在永久存储中并不是显而易见的解决方案。只需提及一件事:您可能需要磁盘写入来执行
选择更新

甲骨文的核心功能是在80年代早期开发的,当时将东西保存在内存中根本不是一种选择。他们只是不得不以某种方式使用磁盘空间

如果要使用磁盘空间,您必须在磁盘上的某个位置放置一个锁

如果一行不在该行内,则在何处保留该行的锁

SQL Server锁系统的开发人员在发明称为Sybase的RDBMS设计时,决定将临时对象(即锁)存储在临时存储器(即RAM)中

但是Oracle的设计总是平衡的:如果数据库中有1000000行,那么就有1000000个锁的存储空间,如果有十亿行,就可以存储十亿个锁,等等

SQL Server的设计在这个意义上是有缺陷的,因为您的RAM和HDD空间可能不平衡。您可能很容易拥有16M的RAM和数TB的磁盘空间。而你的记忆无法容纳所有的锁

这就是为什么当锁计数达到某个限制时,SQL Server决定升级锁:它不为一个数据页(需要10条记录)中的10行保留锁,而是锁定整个数据页(需要1条记录)

另一方面,Oracle在更新行时,只是将锁直接写入数据页

这就是为什么Oracle的锁是行级别的

甲骨文并不是用一个普通的词来“管理”锁:比如说,你不能在甲骨文中得到一个锁定页面的列表

当一个事务需要更新一行时,它只会转到该行并查看它是否被锁定

如果是,则查看哪个事务持有锁(此信息包含在数据页的锁描述符中),并将其自身添加到该事务的通知队列:当锁定事务终止时,原始事务将收到通知并锁定数据

从并发性的角度来看,锁升级完全是穷人的解决方案:它不会给并发性增加任何东西。比如说,你可以在一排连你都没碰过的东西上得到一把锁

从性能的角度来看,在内存中执行操作当然比在磁盘上执行要快


但是,由于Oracle缓存数据锁,并且上述实际操作无论如何都是在内存中执行的,因此性能与之相同或相近。

有关如何维护锁的具体信息,请参阅Microsoft SQL Server 2005:存储引擎的第8章(我没有关联,这只是我遇到的第一个内部信息)。如果你有一个books24x7帐户,它就在那里。它显示在大于16gb的内存机器上,锁哈希表中有2^25(33554432)个插槽,上限为2^31个插槽


对于给定的应用程序,您可能会发现仅使用细粒度锁的总吞吐量更高。您可能会猜到,这完全取决于锁管理的开销与潜在的过度锁定相比如何。

您的意思是管理更多锁会影响性能,从而间接降低并发的好处吗?或者你的意思是管理更多的锁会降低c