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 spinlock 的争用很高。例如, QUERY_EXEC_STATS spinlock 的自旋计数、可能的冲突和后置的值会快速增加。注意 有关如何监视 QUERY_EXEC_STATS spinlock 的详细信息,请参阅 "详细信息" 部分。

在这种情况下,可能会发生较慢的性能。

原因

出现此问题的原因是 SQL Server 2008 R2 或 SQL Server 2012 创建并销毁了一些内存结构,而不是对全局统计信息进行缓存。 这将导致性能瓶颈。

解决方案

累积更新信息

SQL Server 2012

此问题的修补程序首次在 SQL Server 2012 的累积更新1中发布。有关此累积更新包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2679368 SQL Server 2012 的累积更新包1注意 由于这些版本是累积的,因此每个新的修复版本都包含以前的 SQL Server 2012 修复版本附带的所有修补程序和所有安全修补程序。 Microsoft 建议你考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2692828 在 SQL Server 2012 发布后发布的 SQL Server 2012 版本 必须将 SQL Server 2012 修补程序应用到 SQL Server 2012 的安装。

SQL Server 2008 R2 SP1 的累积更新程序包5

此问题的修补程序首次在累积更新5中发布。有关如何获取此累积更新包的 SQL Server 2008 R2 SP1 的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2659694 SQL Server 2008 R2 SP1 的累积更新程序包5注意 由于这些版本是累积的,因此每个新的修复版本都包含以前的 SQL Server 2008 R2 SP1 修复版本附带的所有修补程序和所有安全修补程序。 我们建议你考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2567616 发布 SQL Server 2008 R2 SP1 后发布的 SQL Server 2008 R2 版本

更多信息

若要监视 QUERY_EXEC_STATS spinlock,请在以下代码中根据你的环境调整所需的延迟和迭代次数,然后运行它:

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 产品存在的问题。

需要更多帮助?

扩展你的技能
了解培训
抢先获得新功能
加入 Microsoft 内部人员

此信息是否有帮助?

你对翻译质量的满意程度如何?
哪些因素影响了你的体验?

谢谢您的反馈意见!

×