FIX: Slow performance occurs in SQL Server 2008 R2 or in SQL Server 2012 if high CPU usage is observed with contention over the QUERY_EXEC_STATS spinlock

Article translations Article translations
Article ID: 2662301 - View products that this article applies to.
Expand all | Collapse all

On This Page

Microsoft distributes Microsoft SQL Server 2008 R2 Service Pack 1 (SP1) or Microsoft SQL Server 2012 fixes in one downloadable file. Because the fixes are cumulative, each new release contains all the hotfixes and all the security updates that were included with the previous SQL Server 2008 R2 Service Pack 1 (SP1) or Microsoft SQL Server 2012 update release.

Symptoms

Consider the following scenario:
  • You install an instance of Microsoft SQL Server 2008 R2 or Microsoft SQL Server 2012 on a computer.
  • Concurrent statements that resemble the following are executed in the instance:
    CREATE PROC p AS RETURN (
    query
    ); EXEC p;
    Or, you run a query that contains the following code:

    IF EXISTS(
    subquery
    );
  • The CPU usage is consistently high, and the work threads are in runnable state.
  • The contention for the QUERY_EXEC_STATS spinlock is high.
    For example, the spin count, the possible collisions, and the back-off values for the QUERY_EXEC_STATS spinlock increase quickly.
    Note For more information about how to monitor the QUERY_EXEC_STATS spinlock, see the "More information" section.

In this scenario, slow performance might occur.

Cause

This issue because occurs SQL Server 2008 R2 or SQL Server 2012 creates and destroys some memory structures about global statistics instead of caching them. This causes a performance bottleneck.

Resolution

Cumulative update information

SQL Server 2012

The fix for this issue was first released in Cumulative Update 1 for SQL Server 2012. For more information about this cumulative update package, click the following article number to view the article in the Microsoft Knowledge Base:
2679368 Cumulative update package 1 for SQL Server 2012
Note Because the builds are cumulative, each new fix release contains all the hotfixes and all the security fixes that were included with the previous SQL Server 2012 fix release. Microsoft recommends that you consider applying the most recent fix release that contains this hotfix. For more information, click the following article number to view the article in the Microsoft Knowledge Base:
2692828 The SQL Server 2012 builds that were released after SQL Server 2012 was released
You must apply a SQL Server 2012 hotfix to an installation of SQL Server 2012.

Cumulative update package 5 for SQL Server 2008 R2 SP1

The fix for this issue was first released in Cumulative Update 5. For more information about how to obtain this cumulative update package for SQL Server 2008 R2 SP1, click the following article number to view the article in the Microsoft Knowledge Base:
2659694 Cumulative update package 5 for SQL Server 2008 R2 SP1
Note Because the builds are cumulative, each new fix release contains all the hotfixes and all the security fixes that were included with the previous SQL Server 2008 R2 SP1 fix release. We recommend that you consider applying the most recent fix release that contains this hotfix. For more information, click the following article number to view the article in the Microsoft Knowledge Base:
2567616 The SQL Server 2008 R2 builds that were released after SQL Server 2008 R2 SP1 was released

More information

To monitor the QUERY_EXEC_STATS spinlock, adjust the delay and number of iterations as appropriate for your environment in the following code, and then run it:

SET NOCOUNT ON
CREATE 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 = 1
WHILE @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
      END
SELECT * FROM #spins WHERE [Spinlock Name] = 'QUERY_EXEC_STATS' ORDER BY InsertTime
DROP TABLE #spins

Status

Microsoft has confirmed that this is a problem in the Microsoft products that are listed in the "Applies to" section.

Properties

Article ID: 2662301 - Last Review: November 19, 2012 - Revision: 5.0
Applies to
  • 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
Keywords: 
kbtshoot kbqfe kbfix kbexpertiseadvanced kbsurveynew KB2662301

Give Feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com