修复: 性能问题发生时的 SQL Server 的数据库锁定活动增加

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 2926217
注意
默认情况下,SQL Server 2014 Service Pack 1 包含此修复程序,您不需要添加任何跟踪标记,以启用此修补程序。若要启用此修复程序,在解决方法部分安装累积更新后,必须启动 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 2008 R2 sp2 的累积更新 13

SQL Server 2008 sp3 的累积更新 17

对于 SQL Server 2014年的累积更新 1

SQL Server 2012 sp1 的累积更新 9

有关累积更新 SQL Server

SQL Server 的每个新累积更新包含所有修补程序和所有安全修补程序,已包含在以前的累积更新。为 SQL Server,请查阅最新的累积更新:

修补程序信息

Microsoft 提供了一个受支持的修补程序。然而,此修补程序仅用于解决本文中描述的问题。仅对出现这一特定问题的系统应用此修补程序。

如果此修复程序可供下载,则在此知识库文章顶部"提供修补程序下载"部分。如果未显示此部分,将申请提交到 Microsoft 客户服务和支持,以获取此修复程序。

注意: 如果发生其他问题或需要任何故障诊断时,您可能需要创建单独的服务请求。通常的支持费用将适用于其他支持问题和不计入该特定修补程序的问题。Microsoft 客户服务和支持电话号码,或创建单独的服务请求的完整列表,请访问下面的 Microsoft 网站: 注意: "修补程序下载可用"窗体显示获取此修复程序的语言。如果看不到您的语言,则修补程序没有那种语言的版本。

状态
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 = 1WHILE @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      ENDSELECT * FROM #spinlock_stats ORDER BY [CaptureTime]DROP TABLE #spinlock_stats
有关诊断和解决 SQL Server 上的自旋锁争用的详细信息,请转到下面的文档:

注意:虽然本文档专为 SQL Server 2008 R2 中,信息仍然是适用与 SQL Server 2012年。
参考
有关跟踪标志在 SQL Server 2012年中的详细信息,请转到以下 TechNet 网站:


有关如何查找数据库锁定的数量在每个数据库的用户的详细信息,使用以下查询来计算此值:
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


警告:本文已自动翻译

属性

文章 ID:2926217 - 上次审阅时间:07/29/2015 18:38:00 - 修订版本: 7.0

Microsoft SQL Server 2012 Enterprise, Microsoft SQL Server 2012 Developer, Microsoft SQL Server 2012 Standard, Microsoft SQL Server 2012 Express, Microsoft SQL Server 2012 Web, Microsoft SQL Server 2012 Service Pack 1, Microsoft SQL Server 2014 Developer, Microsoft SQL Server 2014 Enterprise, Microsoft SQL Server 2014 Standard, Microsoft SQL Server 2008 Service Pack 3, Microsoft SQL Server 2008 R2 Service Pack 2

  • kbqfe kbfix kbsurveynew kbexpertiseadvanced kbautohotfix kbhotfixserver kbmt KB2926217 KbMtzh
反馈