locks 选项
使用 locks 选项可以设置可用锁的最大数量,以便限制数据库引擎用于这些锁的内存量。 默认设置为 0,即允许数据库引擎根据不断变化的系统要求动态地分配和收回锁结构。
如果服务器启动时 locks 设为 0,锁管理器将从数据库引擎中获取足够的内存,用于包含 2,500 个锁结构的初始池。 当锁池用完时,将另外为该池获取内存。
通常情况下,如果锁池需要的内存比数据库引擎内存池中可用的内存少,而具有更多可用的计算机内存(尚未达到 max server memory 的阈值),则数据库引擎将动态分配内存以满足锁的需求。 但是,如果内存分配导致操作系统级的换页(例如,如果另一个应用程序与 SQL Server 实例在同一台计算机上运行并使用该计算机的内存),则不会分配更多的锁空间。 动态锁池获取的内存不会超过分配给数据库引擎的内存的 60%。 如果锁池获取的内存达到了数据库引擎实例所获取内存的 60%,或计算机上没有更多的可用内存,则再发出针对锁的请求将生成错误。
建议的配置为允许 SQL Server 动态地使用锁。 但是,可以通过设置 locks 从而替代 SQL Server 动态分配锁资源的能力。 将 locks 的值设为 0 以外的值后,数据库引擎分配的锁的数量不能大于在 locks 中指定的值。 如果 SQL Server 显示消息说明超过了可用锁数,请增大该值。 由于每一个锁都需要消耗内存(每一个锁需 96 字节),增加该值将增加服务器对内存的需要。
locks 选项也会影响何时进行锁升级。 如果 locks 设为 0 时,则当前锁结构使用的内存达到数据库引擎内存池的 40% 时将进行锁升级。 如果 locks 未设为 0,则当锁的数量达到 locks 的指定值的 40% 时将进行锁升级。
locks 选项是高级选项。 如果使用 sp_configure 系统存储过程来更改该设置,则只有在 show advanced options 设置为 1 时才能更改 locks。该设置在重新启动服务器后生效。
在使用非一致性内存访问 (NUMA) 的计算机上,每个 NUMA 节点有一个锁设置,因此,如果在四节点计算机上将数目设置为 10,000,则会允许 40,000 个锁。 可使用以下查询确定 NUMA 节点的数目:
SELECT COUNT(DISTINCT parent_node_id)
FROM sys.dm_os_schedulers
WHERE parent_node_id <> 32
请参阅
概念
其他资源
RECONFIGURE (Transact-SQL)
sp_configure (Transact-SQL)