默认情况下,SQL Server 2014 Service Pack 1 和 Service Pack 3 为 SQL Server 2012年包含此修复程序,您不需要添加任何跟踪标记,以启用此修补程序。若要启用此修复程序,在解决方法部分安装累积更新后,必须启动 Microsoft SQL Server 通过将跟踪标志 1236年添加到启动参数。

症状

假定您在包含多个处理器的计算机上运行的实例,Microsoft SQL Server 2014年、 SQL Server 2012年,SQL Server 2008 中,则 SQL Server 2008 R2。当锁数 (资源类型 = 数据库) 为特定的数据库超过某一阈值,您会遇到下面的性能问题︰

  • 高的值进行LOCK_HASH自旋锁计数。

    注意:请参见"更多信息"部分中有关如何监视该自旋锁的信息。

  • 查询或要求数据库锁的操作需要很长时间才能完成。例如,您可能会注意到以下性能延迟︰

    • SQL Server 登录名

    • 链接的服务器查询

    • sp_reset_connection

    • 交易记录

注意:定位锁列表 (资源类型为数据库) 在给定数据库中,请参阅"详细信息"一节。因环境而异的临界值。

SQL Server 的每个新累积更新包含以前的累积更新所包含的所有修补程序和所有安全修补程序。查看 SQL Server 的最新累积更新:


修补程序信息
可以从 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


Need more help?

Expand your skills
Explore Training
Get new features first
Join Microsoft Insiders

Was this information helpful?

How satisfied are you with the translation quality?
What affected your experience?

Thank you for your feedback!

×