修复: 缓慢或 SQL Server 2012 SQL Server 2008 R2 中如果 CPU 使用率过高通过 QUERY_EXEC_STATS 自旋锁争用与观察到

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 2662301
Microsoft 将分发 Microsoft SQL Server 2008 R2 Service Pack 1 (SP1) 或 Microsoft SQL Server 2012年修复了一个可下载的文件中。修补程序是累积性的因为每个新版本包含的所有修补程序和以前的 SQL Server 2008 R2 Service Pack 1 (SP1) 或 Microsoft SQL Server 2012年附带的所有安全更新的都更新版本。
症状
请考虑以下情形:
  • 您的计算机上安装 Microsoft SQL Server 2008 R2 或 Microsoft SQL Server 2012年的实例。
  • 实例中执行与以下内容类似的并发语句:
    CREATE PROC p AS RETURN (
    query
    ); EXEC p;
    或者,您运行的查询包含以下代码:

    IF EXISTS(
    subquery
    );
  • CPU 使用率值一直较高,并且工作线程都处于运行状态。
  • 争用 QUERY_EXEC_STATS 自旋锁很高。
    例如,重试次数、 可能的冲突,以及回退值 QUERY_EXEC_STATS 自旋锁快速增加。
    注意 有关如何监视的详细信息 QUERY_EXEC_STATS 自旋锁,请参见"更多信息"一节。

在这种情况下,可能会出现性能降低。

原因
此问题,因为发生 SQL Server 2008 R2 或 SQL Server 2012年创建和销毁有关全局统计信息,而不是缓存它们的一些内存结构。这会导致性能瓶颈。
解决方案

累积更新信息

SQL Server 2012

此问题的修补程序是首次推出累积更新 1 中的 SQL Server 2012年。有关此累积更新包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2679368 累积更新包 1 个 SQL Server 2012
注意 生成具有累积性的因为每个新修补程序版本包含的所有修补程序和所有安全修补程序包含以前的 SQL Server 2012年修补程序版本。Microsoft 建议您考虑应用最新的修补程序版本包含此修复程序。有关详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2692828 SQL Server 2012年生成 SQL Server 2012年发布后发布
您必须将 SQL Server 2012年修补程序应用于的 SQL Server 2012年。

累积更新包 5 SQL Server 2008 R2 sp1

此问题的修补程序是累积性更新 5 中首次推出。有关如何获取此累积更新包的 SQL Server 2008 R2 SP1 的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2659694 累积更新包 5 SQL Server 2008 R2 sp1
注意 生成具有累积性的因为每个新修补程序版本包含的所有修补程序和所有安全修补程序以前的 SQL Server 2008 R2 SP1 中包含的修补程序版本。我们建议您考虑应用最新的修补程序版本包含此修复程序。有关详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2567616 SQL Server 2008 R2 生成 SQL Server 2008 R2 SP1 发布后发布
更多信息
要监视QUERY_EXEC_STATS自旋锁,请调整为适合您的环境,在以下代码中,迭代次数和延迟,并运行它:

SET NOCOUNT ONCREATE TABLE #spins([Spinlock Name] varchar(50),Collisions numeric,Spins numeric,[Spins/Collision] float,[Sleep Time (ms)] numeric,Backoffs numeric, InsertTime datetime DEFAULT GETDATE())DECLARE @counter int = 1WHILE @counter < 10      BEGIN            INSERT INTO #spins ([Spinlock Name], Collisions, Spins, [Spins/Collision], [Sleep Time (ms)], Backoffs) EXECUTE ('DBCC SQLPERF (''SPINLOCKSTATS'') WITH NO_INFOMSGS')            WAITFOR DELAY '00:00:05'            SET @counter +=1      ENDSELECT * FROM #spins WHERE [Spinlock Name] = 'QUERY_EXEC_STATS' ORDER BY InsertTimeDROP TABLE #spins

状态
Microsoft 已经确认这是"适用于"一节中列出的 Microsoft 产品中的问题。

属性

文章 ID:2662301 - 上次审阅时间:04/12/2012 10:26:00 - 修订版本: 1.0

Microsoft SQL Server 2008 R2 Datacenter, Microsoft SQL Server 2008 R2 Developer, Microsoft SQL Server 2008 R2 Enterprise, Microsoft SQL Server 2008 R2 Standard, Microsoft SQL Server 2012 Developer, Microsoft SQL Server 2012 Enterprise, Microsoft SQL Server 2012 Standard

  • kbqfe kbfix kbexpertiseadvanced kbsurveynew kbmt KB2662301 KbMtzh
反馈