每个在SQL Server中创建的锁都会消耗内存资源。当锁的数量增加时,内存就会减少。如果锁的内存使用百分比超过一个特定阈值,SQL Server会将细粒度锁(页或行)转换为粗粒度锁(表锁)。这个过程称为锁升级。锁升级可以减少SQL Servcr实例占有的锁的数最,减少锁内存的使用。
虽然细粒度锁会消耗更多的内存,但由于多个查询可以访问未锁定的行,因此也会改善并发性。引入表锁可能会减少内存的消耗,但也会带来阻塞,这是因为一条查询锁住了整个表。根据使用数据库的应用程序,这个行为可能是不希望发生的,而且你可能希望当SQL Server实施锁升级时尽量获得更多的控制。
SQL Server 2008引入了使用ALTER TABLE命令在表级别控制锁升级的功能。现在可以从如下3个设置中选择。
- TABLE,这是SQL Server 2005中使用的默认的行为。当设置为该值时,就在表级别启用了锁升级,不论是否为分区表。
- AUTO,如果表已分区,则在分区级别(堆或B树)启用锁升级。如果表未分区,锁升级将发生在表级别上。
- DISABLE在表级别删除锁升级。注意,对于用了TABLOCK提示或使用可序列化隔离级别下堆的查询时,你仍然可能看到表锁。
1.修改表的两个新的SQL Server 2008设置:
use AdventureWorks
go
ALTER TABLE person.Address
SET (LOCK_ESCALATION=AUTO)
SELECT lock_escalation,lock_escalation_desc
FROM sys.tables
WHERE name='Address'