Le concessioni elevate di CPU o memoria possono verificarsi con query che utilizzano un ciclo annidato ottimizzato o un ordinamento batch

Questo articolo consente di risolvere il problema in cui si verifica un utilizzo elevato della CPU quando si eseguono query in SQL Server.

Si applica a: SQL Server
Numero KB originale: 2009160

Sintomi

Quando si gestisce Microsoft SQL Server con un carico di lavoro altamente simultaneo, è possibile che si verifichino alcuni problemi di prestazioni nelle query. Questo comportamento può presentare un utilizzo medio-elevato della CPU o richieste di concessione di memoria estreme.

È anche possibile che si verifichino altri effetti collaterali, ad esempio condizioni OOM, pressione della memoria per lo sfratto della cache del piano o attese impreviste RESOURCE_SEMAPHORE .

Inoltre, è possibile notare che i piani di query per le query che utilizzano una grande quantità di CPU o memorie hanno l'attributo OPTIMIZED per un operatore di join Nested Loops impostato su True.

Causa

Questo problema può verificarsi in alcuni casi in cui SQL Server query processor introduce un'operazione di ordinamento facoltativa per migliorare le prestazioni. Questa operazione è nota come "Ciclo annidato ottimizzato" o "Ordinamento batch" e Query Optimizer determina quando introdurre al meglio questi operatori. In rari casi, la query tocca solo alcune righe, ma il costo di installazione per l'operazione di ordinamento è così significativo che il costo del ciclo annidato ottimizzato supera i vantaggi. Pertanto, in questi casi è possibile osservare prestazioni più lente rispetto a quanto previsto.

Risoluzione

Flag di traccia 2340

Per risolvere il problema, usare il flag di traccia 2340 per disabilitare l'ottimizzazione. Il flag di traccia 2340 indica al processore di query di non usare un'operazione di ordinamento (ordinamento batch) per i join di cicli annidati ottimizzati durante la generazione di un piano di query. Ciò influisce sull'intera istanza.

Prima di abilitare questo flag di traccia, è possibile testare accuratamente le applicazioni per assicurarsi di ottenere i vantaggi previsti per le prestazioni quando si disabilita questa ottimizzazione. Ciò è dovuto al fatto che l'ottimizzazione dell'ordinamento può essere utile quando si verifica un aumento elevato del numero di righe toccate dal piano.

Per altre informazioni, vedere DBCC TRACEON - Flag di traccia (Transact-SQL).

Modificare il codice per usare l'hint DISABLE_OPTIMIZED_NESTED_LOOP

In alternativa, applicare l'hint di query seguente DISABLE_OPTIMIZED_NESTED_LOOP per disabilitare l'ottimizzazione a livello di query.

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

Per altre informazioni, vedere DISABLE_OPTIMIZED_NESTED_LOOP.

Ulteriori informazioni

Opzioni di avvio del servizio Motore di database

Si applica a

  • SQL Server 2005-SQL Server 2019