KB3026083 — POPRAWKA: SOS_CACHESTORE rywalizacja o spinlock w pamięci podręcznej planów SQL Server ad hoc powoduje wysokie użycie procesora w SQL Server

Dotyczy
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

Objawy

Gdy w tym samym zasobniku skrótów występuje zbyt wiele jednoczesnych wstawień lub pamięć podręczna planu SQL Server ad hoc osiąga limit wpisu wynoszący 160 036, występuje poważna rywalizacja o SOS_CACHESTORE spinlock. W takiej sytuacji występuje wysokie użycie procesora CPU w Microsoft SQL Server.

Przyczyna

Ten problem występuje, gdy pamięć podręczna planu programu SQL Server osiąga limit wpisów, a plany o niskim koszcie muszą zostać usunięte w celu wstawienia nowych planów. Powoduje to silną rywalizację o SOS_CACHESTORE spinlock, który zapewnia synchronizację dla zasobników tabeli skrótów pamięci podręcznej planu SQL Server.

Rozwiązanie

Informacje o aktualizacji zbiorczej

Ten problem został po raz pierwszy rozwiązany w następującej aktualizacji zbiorczej programu SQL Server.

Informacje o aktualizacjach zbiorczych dla programu SQL Server

Każda nowa aktualizacja zbiorcza programu SQL Server zawiera wszystkie poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji skumulowanej. Sprawdź najnowsze aktualizacje zbiorcze dla programu SQL Server:

Więcej informacji

Pamięć podręczna planu ma dwa limity: całkowitego rozmiaru i łącznej liczby wszystkich planów. Limity rozmiaru i liczby wpisów wyjaśniono w następującym oficjalnym dokumencie:

Planowanie wewnętrznych elementów pamięci podręcznej

Maksymalna liczba wpisów, które może pomieścić pamięć podręczna planu, jest czterokrotnie większa niż liczba zasobników. Możesz zweryfikować te informacje, uruchamiając następujące zapytania:


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' )

Na przykład w systemach 64-bitowych liczba zasobników pamięci podręcznej planu programu SQL Server wynosi 40 009. Dlatego maksymalna liczba wpisów, które mogą się zmieścić w pamięci podręcznej planu programu SQL Server, wynosi 160 036.

W przypadku obciążenia pracą, która używa różnych zapytań ad hoc, ten limit może stać się wąskim gardłem. Zmiana wprowadzona przez tę poprawkę rozwiązuje ten problem. Po zainstalowaniu tej poprawki i włączeniu zmiany za pomocą flagi śledzenia uruchamiania "-T 174" liczba zasobników zostanie zwiększona do 160 001 w systemach 64-bitowych. Pamięć podręczna planu może wtedy przechowywać maksymalnie 640 004 plany.

Stan

Firma Microsoft potwierdziła, że jest to problem dotyczący produktów firmy Microsoft wymienionych w sekcji „Dotyczy”.