Wysokie przydziały procesora CPU lub pamięci mogą wystąpić w przypadku zapytań korzystających z zoptymalizowanej pętli zagnieżdżonej lub sortowania wsadowego

Ten artykuł pomaga rozwiązać problem polegający na tym, że wysokie użycie procesora CPU występuje podczas uruchamiania zapytań w SQL Server.

Dotyczy: SQL Server
Oryginalny numer KB: 2009160

Symptomy

W przypadku korzystania z usługi Microsoft SQL Server, która ma wysoce współbieżne obciążenie, w zapytaniach mogą wystąpić problemy z wydajnością. To zachowanie może być widoczne jako średnie lub wysokie użycie procesora CPU lub ekstremalne żądania udzielenia pamięci.

Mogą również wystąpić inne skutki uboczne, takie jak warunki OOM, obciążenie pamięcią podczas eksmisji pamięci podręcznej planu lub nieoczekiwane RESOURCE_SEMAPHORE oczekiwania.

Ponadto można zauważyć, że plany zapytań dla zapytań, które zużywają dużo procesora CPU lub pamięci, mają atrybut OPTIMIZED dla operatora sprzężenia zagnieżdżonych pętli ustawiony na wartość True.

Przyczyna

Ten problem może wystąpić w niektórych przypadkach, gdy procesor zapytań SQL Server wprowadza opcjonalną operację sortowania w celu zwiększenia wydajności. Ta operacja jest znana jako "Zoptymalizowana pętla zagnieżdżona" lub "Sortowanie wsadowe", a optymalizator zapytań określa, kiedy najlepiej wprowadzić te operatory. W rzadkich przypadkach zapytanie dotyka tylko kilku wierszy, ale koszt konfiguracji operacji sortowania jest tak znaczący, że koszt zoptymalizowanej pętli zagnieżdżonej przeważa nad jej korzyściami. W związku z tym w takich przypadkach można zaobserwować wolniejszą wydajność w porównaniu z oczekiwanymi.

Rozwiązanie

Flaga śledzenia 2340

Aby rozwiązać ten problem, użyj flagi śledzenia 2340, aby wyłączyć optymalizację. Flaga śledzenia 2340 nakazuje procesorowi zapytań, aby nie używał operacji sortowania (sortowania wsadowego) dla zoptymalizowanych sprzężeń zagnieżdżonych pętli podczas generowania planu zapytania. Ma to wpływ na całe wystąpienie.

Przed włączeniem tej flagi śledzenia możesz dokładnie przetestować aplikacje, aby upewnić się, że oczekiwane korzyści z wydajności są uzyskiwane po wyłączeniu tej optymalizacji. Dzieje się tak, ponieważ optymalizacja sortowania może być przydatna, gdy istnieje duży wzrost liczby wierszy, których dotyczy plan.

Aby uzyskać więcej informacji, zobacz DBCC TRACEON — Trace Flags (Transact-SQL).

Modyfikowanie kodu w celu użycia wskazówki DISABLE_OPTIMIZED_NESTED_LOOP

Alternatywnie zastosuj następującą DISABLE_OPTIMIZED_NESTED_LOOP wskazówkę dotyczącą zapytania, aby wyłączyć optymalizację na poziomie zapytania.

SELECT * FROM Person.Address  
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (USE HINT (DISABLE_OPTIMIZED_NESTED_LOOP)); 

Aby uzyskać więcej informacji, zobacz DISABLE_OPTIMIZED_NESTED_LOOP.

Więcej informacji

Opcje uruchamiania usługi aparatu bazy danych

Informacje zawarte w tym artykule dotyczą

  • SQL Server 2005–SQL Server 2019