修补程序信息
可以从 Microsoft 获得受支持的修复程序。然而,此修补程序仅用于解决本文中描述的问题。仅对出现这一特定问题的系统应用此修补程序。
如果此修复程序可供下载,则在此知识库文章顶部"提供修补程序下载"部分。如果未显示此部分,将申请提交到 Microsoft 客户服务和支持,以获取此修复程序。
注意:如果发生其他问题或需要任何故障诊断时,您可能需要创建单独的服务请求。通常的支持费用将适用于其他支持问题和不计入该特定修补程序的问题。有关 Microsoft 客户服务和支持电话号码或创建单独的服务请求的完整列表,请访问下面的 Microsoft 网站︰
http://support.microsoft.com/contactus/?ws=support注意:"修补程序下载可用"窗体显示获取此修复程序的语言。如果看不到您的语言,则修补程序没有那种语言的版本。
状态
Microsoft 已经确认这是“适用于”一节中列出的 Microsoft 产品中的问题。
详细信息
当应用程序连接 SQL Server 时,它首先建立数据库上下文。默认情况下,该连接将尝试获得 SH 模式中的数据库锁定。停止连接或连接的生命周期内更改数据库上下文时,将释放SH 数据库锁。如果您有多个活动连接,使用相同的数据库环境,可以有众多的该特定数据库的数据库资源类型的锁。
在具有 16 个或多个 Cpu 的计算机,只有表对象使用分区的锁方案。但是,不进行分区数据库锁。因此,越大的数据库锁定,为 SQL Server,以获得对数据库的锁需要的时间越长。大多数应用程序不会遇到任何的问题,由这种设计。但只要数量超过某一阈值,额外工作和时间需要来获取锁。虽然成本仅微秒每个额外的锁,但总的时间可以迅速增加因为受使用自旋锁锁定哈希存储桶。这会导致额外的 CPU 周期,等待获取锁的其他工作人员。
此修补程序引入了数据库锁定分区时在启动时启用跟踪标志 T1236。分区数据库锁保留锁列表的深度可在每个本地分区管理。这将极大地优化用于获取数据库锁的访问路径。
若要监视LOCK_HASH自旋锁,可以使用下面的查询。SET NOCOUNT ONCREATE TABLE #spinlock_stats([CaptureTime] datetime,[name] nvarchar(512),[collisions] bigint,
[spins] bigint,[spins_per_collision] real,[sleep_time] bigint,[backoffs] int)
DECLARE @counter int = 1
WHILE @counter < 100
BEGIN
INSERT INTO #spinlock_stats SELECT GETDATE() as "CaptureTime" , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
WAITFOR DELAY '00:00:05'
SET @counter +=1
END
SELECT * FROM #spinlock_stats ORDER BY [CaptureTime]
DROP TABLE #spinlock_stats
有关诊断和解决 SQL Server 上的自旋锁争用的详细信息,请转到下面的文档︰
诊断和解决 SQL Server 上的自旋锁争用注意:虽然本文档专为 SQL Server 2008 R2 中,信息仍然是适用与 SQL Server 2012年。
参考资料
有关跟踪标志在 SQL Server 2012年中的详细信息,请转到以下 TechNet 网站︰
有关跟踪标志在 SQL Server 2012年中的信息
有关如何查找数据库锁定的数量在每个数据库的用户的详细信息,使用以下查询来计算此值︰select Resource_database_id, resource_type, request_mode, request_status, count (*) 'LockCount' from sys.dm_tran_locks
group by Resource_database_id, resource_type, request_mode, request_status
作者︰jannaw; jackli
作者︰ v-shysun
技术审阅︰ Bob Dorr;Bob 选区;Ajayj;Sureshka;ramakoni;jackli;jannaw;sqlprev
编辑器︰