KB2667211-una query può richiedere molto tempo per l'esecuzione se Query Optimizer usa l'operatore Top in SQL Server 2008 R2 o in SQL Server 2012

Microsoft distribuisce le correzioni di Microsoft SQL Server 2008 R2 Service Pack 1 (SP1) o Microsoft SQL Server 2012 in un unico file scaricabile. Poiché le correzioni sono cumulative, ogni nuova versione contiene tutti gli hotfix e tutti gli aggiornamenti della sicurezza inclusi nella versione precedente di SQL Server 2008 R2 Service Pack 1 (SP1) o SQL Server 2012 Update.

Sintomi

Consideriamo lo scenario seguente. Si esegue una query in Microsoft SQL Server 2008 R2 o in Microsoft SQL Server 2012 e query optimizer genera un piano di esecuzione che contiene l'operatore Top. In questo scenario, la query può richiedere molto tempo per l'esecuzione. Ad esempio, è possibile eseguire una query simile alla seguente:

SELECT TableA.Col1 FROM TableA JOIN TableB ON TableA.Col1 = TableB.Col1 WHERE TableA.Col2 = N'A' AND TableB.Col3 IN (SELECT Col1 FROM TableC )Questa query include due join. Un join è compreso tra TableB e TableC. Questo è implicito nella presenza del predicato IN. L'altro join è compreso tra la tabella A e il risultato del primo join. Il predicato IN restituirà true se la query trova almeno una riga che soddisfa il primo predicato di join. Di conseguenza, Query Optimizer aggiunge l'operatore Top nel piano di esecuzione della query. Una query di questo tipo può restituire solo poche righe. Tuttavia, potrebbe essere necessario più tempo per eseguire la query di quanto previsto. Nel piano di esecuzione della query effettivo il numero stimato di righe differisce in modo significativo rispetto al numero effettivo di righe. Ciò influisce sulla capacità di query optimizer di stimare accuratamente il costo per le diverse scelte di piano. Il problema può verificarsi anche se si usa l'operatore TOP in modo esplicito o se si usa uno degli operatori seguenti:

  • OPZIONE (FAST N)

  • IN

  • ESISTE

Risoluzione

Informazioni sull'aggiornamento cumulativo

SQL Server 2008 R2 Service Pack 2

La correzione di questo problema è stata rilasciata per la prima volta in aggiornamento cumulativo 1 per SQL Server 2008 R2 Service Pack 2. Per altre informazioni su come ottenere questo pacchetto di aggiornamento cumulativo, fare clic sul numero dell'articolo della Microsoft Knowledge Base seguente per visualizzare l'articolo:

2720425 Pacchetto di aggiornamento cumulativo 1 per SQL Server 2008 R2 Service Pack 2Nota Poiché le build sono cumulative, ogni nuova versione di correzione contiene tutti gli hotfix e tutti gli aggiornamenti della sicurezza inclusi nella versione precedente di SQL Server 2008 R2 Fix. Ti consigliamo di considerare l'applicazione della versione di correzione più recente che contiene questo hotfix. Per ulteriori informazioni, fare clic sul numero dell'articolo seguente per visualizzare l'articolo nella Microsoft Knowledge Base:

2730301 Build di SQL Server 2008 R2 rilasciate dopo il rilascio di SQL Server 2008 R2 Service Pack 2

SQL Server 2008 R2 Service Pack 1

La correzione di questo problema è stata rilasciata per la prima volta in aggiornamento cumulativo 7 per SQL Server 2008 R2 Service Pack 1. Per altre informazioni su come ottenere questo pacchetto di aggiornamento cumulativo, fare clic sul numero dell'articolo della Microsoft Knowledge Base seguente per visualizzare l'articolo:

2703282 Pacchetto di aggiornamento cumulativo 7 per SQL Server 2008 R2 Service Pack 1Nota Poiché le build sono cumulative, ogni nuova versione di correzione contiene tutti gli hotfix e tutti gli aggiornamenti della sicurezza inclusi nella versione precedente di SQL Server 2008 R2 Fix. Ti consigliamo di considerare l'applicazione della versione di correzione più recente che contiene questo hotfix. Per ulteriori informazioni, fare clic sul numero dell'articolo seguente per visualizzare l'articolo nella Microsoft Knowledge Base:

2567616 Le build di SQL Server 2008 R2 rilasciate dopo il rilascio di SQL Server 2008 R2 Service Pack 1

SQL Server 2012

La correzione di questo problema è stata rilasciata per la prima volta in aggiornamento cumulativo 2 per SQL Server 2012. Per altre informazioni su questo pacchetto di aggiornamento cumulativo, fare clic sul numero dell'articolo della Microsoft Knowledge Base seguente per visualizzare l'articolo:

2703275 Pacchetto di aggiornamento cumulativo 2 per SQL Server 2012Nota Poiché le build sono cumulative, ogni nuova versione di correzione contiene tutti gli hotfix e tutti gli aggiornamenti della sicurezza inclusi nella versione precedente di SQL Server 2012 FIX. Microsoft consiglia di applicare l'ultima versione di correzione che contiene questo hotfix. Per ulteriori informazioni, fare clic sul numero dell'articolo seguente per visualizzare l'articolo nella Microsoft Knowledge Base:

2692828 Build di SQL Server 2012 rilasciate dopo il rilascio di SQL Server 2012 È necessario applicare un hotfix di SQL Server 2012 a un'installazione di SQL Server 2012.

SQL Server 2008 R2

La correzione di questo problema è stata rilasciata per la prima volta nell'aggiornamento cumulativo 13. Per altre informazioni su come ottenere questo pacchetto di aggiornamento cumulativo per SQL Server 2008 R2, fare clic sul numero dell'articolo seguente per visualizzare l'articolo della Microsoft Knowledge Base:

2679366 Pacchetto di aggiornamento cumulativo 13 per SQL Server 2008 R2Nota Poiché le build sono cumulative, ogni nuova versione di correzione contiene tutti gli hotfix e tutti gli aggiornamenti della sicurezza inclusi nella versione precedente di SQL Server 2008 R2 Fix. Ti consigliamo di considerare l'applicazione della versione di correzione più recente che contiene questo hotfix. Per ulteriori informazioni, fare clic sul numero dell'articolo seguente per visualizzare l'articolo nella Microsoft Knowledge Base:

981356 Build di SQL Server 2008 R2 rilasciate dopo il rilascio di SQL Server 2008 R2Nota Dopo aver installato l'aggiornamento cumulativo, è necessario attivare il contrassegno di traccia 4199 per abilitare la correzione fornita in questo aggiornamento cumulativo se sono soddisfatte le condizioni seguenti:

  • Il piano di query ha un operatore superiore sopra un operatore di join loop annidato (join 1) sul lato destro di un altro operatore APPLY/join (join 2).

  • Il lato esterno di join 1 contiene un riferimento esterno al lato esterno di join 2.

  • Join 1 usa un predicato di uguaglianza in una colonna di sinistra che è univoca.

Un esempio di una query di questo tipo viene visualizzato nella sezione "Sintomi". In questo modo si presuppone che nel database siano presenti vincoli di univocità. Se sono presenti altre query che contengono gli operatori TOP, OPTION (FAST N), IN o EXISTs e producono sintomi simili ma che non corrispondono al modello descritto in questo articolo, attivare il contrassegno di traccia 4138.Warning Se si Abilita il contrassegno di traccia 4138, le prestazioni potrebbero diminuire per altre query che contengono gli operatori TOP, OPTION (FAST N), IN o EXISTs. Il flag di traccia 4138 deve essere usato solo quando sono soddisfatte le condizioni seguenti:

  • Il relativo effetto sulle query lente che coinvolgono questi operatori è confermato.

  • Non esistono altre soluzioni alternative utili.

  • Nessuna regressione viene rilevata in altre query che contengono operatori simili.

Stato

Microsoft ha confermato che questo problema si verifica nei prodotti elencati nella sezione "Si applica a".

Soluzione alternativa

Per risolvere il problema, usare l'operatore OUTER JOIN sinistro o uno dei diversi suggerimenti per l'utilità di ottimizzazione.

Serve aiuto?

Amplia le tue competenze
Esplora i corsi di formazione
Ottieni in anticipo le nuove caratteristiche
Partecipa a Microsoft Insider

Queste informazioni sono risultate utili?

Grazie per il feedback!

Grazie per il tuo feedback! Potrebbe essere utile metterti in contatto con uno dei nostri operatori del supporto di Office.

×