Delen via


Hoge CPU- of geheugentoewijzingen kunnen optreden bij query's die gebruikmaken van geoptimaliseerde geneste lus of batchsortering

Dit artikel helpt u bij het oplossen van het probleem waarbij hoog CPU-gebruik optreedt wanneer u query's uitvoert in SQL Server.

Van toepassing op: SQL Server
Oorspronkelijk KB-nummer: 2009160

Symptomen

Wanneer u Werkt met Microsoft SQL Server met een zeer gelijktijdige workload, merkt u mogelijk prestatieproblemen in query's. Dit gedrag kan optreden als gemiddeld tot hoog CPU-gebruik of extreme aanvragen voor geheugentoe kennen.

U kunt ook andere bijwerkingen ervaren, zoals OOM-omstandigheden, geheugendruk voor verwijdering van plancache of onverwachte RESOURCE_SEMAPHORE wachttijden.

Bovendien ziet u mogelijk dat queryplannen voor query's die veel CPU of geheugen verbruiken, het kenmerk OPTIMIZED hebben voor een operator voor het samenvoegen van geneste lussen op Waar.

Oorzaak

Dit probleem kan optreden in sommige gevallen waarbij sql Server-queryprocessor een optionele sorteerbewerking introduceert om de prestaties te verbeteren. Deze bewerking staat bekend als een 'Geoptimaliseerde geneste lus' of 'Batch-sortering' en de queryoptimalisatie bepaalt wanneer u deze operators het beste kunt introduceren. In zeldzame gevallen raakt de query slechts een paar rijen aan, maar de installatiekosten voor de sorteerbewerking zijn zo belangrijk dat de kosten van de geoptimaliseerde geneste lus opwegen tegen de voordelen ervan. Daarom kunt u in die gevallen tragere prestaties observeren in vergelijking met wat er wordt verwacht.

Oplossing

Traceringsvlag 2340

Gebruik traceringsvlag 2340 om de optimalisatie uit te schakelen om het probleem op te lossen. Traceringsvlag 2340 geeft de queryprocessor de opdracht om geen sorteerbewerking (batchsorteerd) te gebruiken voor geoptimaliseerde geneste luskoppelingen bij het genereren van een queryplan. Dit is van invloed op het hele exemplaar.

Voordat u deze traceringsvlag inschakelt, kunt u uw toepassingen grondig testen om ervoor te zorgen dat u de verwachte prestatievoordelen krijgt wanneer u deze optimalisatie uitschakelt. Dit komt doordat de sorteeroptimalisatie handig kan zijn wanneer er een grote toename is in het aantal rijen dat wordt aangeraakt door het plan.

Zie DBCC TRACEON - Trace Flags (Transact-SQL) voor meer informatie.

Code wijzigen om de DISABLE_OPTIMIZED_NESTED_LOOP hint te gebruiken

U kunt ook de volgende DISABLE_OPTIMIZED_NESTED_LOOP queryhint toepassen om de optimalisatie op queryniveau uit te schakelen.

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

Zie DISABLE_OPTIMIZED_NESTED_LOOP voor meer informatie.

Meer informatie

Opstartopties voor database-engineservice

Van toepassing op

  • SQL Server 2005 tot en met SQL Server 2019