KB3026083 – КОРЕКЦИЯ: SOS_CACHESTORE състезание за завъртане със заключване на непланиран кеш за план за SQL Server причинява високо натоварване на процесора в SQL Server

Отнася се за
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2014 Web - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2017 Developer SQL Server 2017 Enterprise SQL Server 2017 Enterprise Core

Симптоми

Когато в един и същи набор хешове се появяват твърде много едновременни вмъквания или когато кешът на плана за ad hoc SQL Server достигне ограничението си за влизане от 160 036, възниква сериозно състезание за SOS_CACHESTORE завъртане. В тази ситуация в Microsoft SQL Server се наблюдава високо натоварване на процесора.

Причина

Проблемът възниква, когато кешът за плана на SQL Server достигне прага си за влизане и плановете, които са с ниска цена, трябва да бъдат извадени, за да се вмъкнат нови планове. Това води до сериозни състезания за SOS_CACHESTORE spinlock, който осигурява синхронизиране за наборите хеширащи таблици на кеша на плана за SQL Server.

Решение

Информацията за кумулативната актуализация

Проблемът е коригиран за първи път в следващата кумулативна актуализация на SQL Server.

За кумулативните актуализации за SQL Server

Всяка нова кумулативна актуализация за SQL Server съдържа всички актуални поправки и корекции на защитата, които са били включени в предишната кумулативна актуализация. Прегледайте последните кумулативни актуализации за SQL Server:

Повече информация

Кешът на плана има две ограничения: Общият размер и общият брой на всички планове. Ограниченията за размер и брой записи са обяснени в следната техническа документация:

Планиране на вътрешни елементи на кеша

Максималният брой записи, който кешът за план може да помести, е четири пъти по-голям от броя на наборите. Можете да проверите тази информация, като изпълните следните заявки:


select name, type, buckets_count 
from sys.dm_os_memory_cache_hash_tables
where name IN ( 'SQL Plans' , 'Object Plans' , 'Bound Trees' )
 
select name, type, pages_kb, entries_count 
from sys.dm_os_memory_cache_counters
where name IN ( 'SQL Plans' , 'Object Plans' ,  'Bound Trees' )

Например при 64-битови системи броят на наборите за кеша на плана на SQL Server е 40 009. Следователно, максималният брой записи, който може да се побере в кеша на плана на SQL Server, е 160 036.

Ако имате работно натоварване, което използва различни заявки за конкретна цел, това ограничение може да се окаже слабо звено. Промяната, която се прави от тази гореща корекция, решава тази ситуация. След като инсталирате тази гореща корекция и разрешите промяната с помощта на флага за проследяване при стартиране "-T 174", броят набори се увеличава до 160 001 на 64-битови системи. Кешът на плана след това може да побере най-много 640 004 плана.

Състояние

Microsoft потвърждава, че това е проблем в продуктите на Microsoft, които са изброени в раздела „Важи за“.