TSQL Perché Top è più veloce con una variabile?


10

Buongiorno a tutti,

Ho lavorato su un sql moderatamente complesso per "ottenere" alcuni dati da un database di prodotti di terze parti, per visualizzarli nelle nostre applicazioni interne.

Ho aggiunto una selezione per ottenere il record più alto da una tabella all'interno di una sottoquery (se questo ha senso)

la query ha impiegato quasi 3 minuti per restituire un set di risultati finali di 100 record utilizzando

SELECT TOP 1 ...

Ho cercato online miglioramenti per quello che stavo cercando di ottenere ed è stato suggerito di cambiare la mia selezione per utilizzare una variabile, come di seguito

DECLARE @topCount INT
SET @topCount = 1

SELECT TOP (@topCount) ...

Questa operazione ha richiesto la stessa query da 3 minuti a 1 secondo, il che è fantastico!

Qualcuno può spiegare perché è così.

Risposte:


14

Quando esegui questa operazione, top 1Query Optimizer costruirà un piano creato per recuperare 1 riga il più velocemente possibile.

Quando si utilizza una variabile locale, il valore della variabile non è noto all'ottimizzatore e crea invece un piano ottimizzato per recuperare 100 righe il più velocemente possibile.

Nel tuo caso, il piano di query generato con un obiettivo di riga pari a 100 è il piano migliore da utilizzare anche quando desideri solo una riga.

Per verificare puoi provare ad aggiungere option (recompile)alla tua query con la variabile. In tal caso, SQL Server utilizzerà il valore corrente di @topCountcome obiettivo di riga e poiché quello è 1, è necessario ottenere il piano lento.


Capisco la differenza nel piano, ma mi stupisce che il recupero di 1 riga possa essere più lento del recupero di 100 righe. Penserei che se il piano a 100 righe funziona meglio, SQL Server userebbe lo stesso piano per top 1.
Brandon,

@Brandon non recupera 100 righe, costruisce solo il piano di esecuzione supponendo che 100 righe siano ciò che si desidera. L'esecuzione termina quando viene trovata 1 riga.
Mikael Eriksson,

Controllare cosa c'è di diverso nel piano di esecuzione in questi casi probabilmente aiuterebbe a capire qual è il problema con i primi 1.
James Z
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.