Un primo sguardo ai piani di esecuzione mostra che l'espressione 1/0
è definita negli operatori di calcolo scalare:
Ora, anche se i piani di esecuzione iniziano a essere eseguiti all'estrema sinistra, chiamando ripetutamente Open
e GetRow
metodi su iteratori secondari per restituire risultati, SQL Server 2005 e versioni successive contengono un'ottimizzazione per cui le espressioni sono spesso definite solo da uno scalare di calcolo, con valutazione differita fino a una successiva l'operazione richiede il risultato :
In questo caso, il risultato dell'espressione è necessario solo quando si assembla la riga per il ritorno al client (cosa che si può pensare di accadere SELECT
sull'icona verde ). Secondo tale logica, una valutazione differita significherebbe che l'espressione non viene mai valutata perché nessuno dei due piani genera una riga di ritorno. Per elaborare un po 'il punto, né la Ricerca indice cluster né la Scansione tabella restituiscono una riga, quindi non vi è alcuna riga da assemblare per il ritorno al client.
Tuttavia, esiste un'ottimizzazione separata per cui alcune espressioni possono essere identificate come costanti di runtime e quindi valutate una volta prima dell'inizio dell'esecuzione della query . In questo caso, un'indicazione che si è verificata può essere trovata nello showplan XML (piano di ricerca dell'indice cluster a sinistra, piano di scansione della tabella a destra):
Ho scritto di più sui meccanismi sottostanti e su come possono influenzare le prestazioni in questo post del blog . Utilizzando le informazioni fornite lì, possiamo modificare la prima query in modo che entrambe le espressioni vengano valutate e memorizzate nella cache prima dell'inizio dell'esecuzione:
select 1/0 * CONVERT(integer, @@DBTS)
from #temp
where id = 1
select 1/0
from #temp2
where id = 1
Ora, il primo piano contiene anche un riferimento di espressione costante ed entrambe le query producono il messaggio di errore. L'XML per la prima query contiene:
Ulteriori informazioni: calcolare scalari, espressioni e prestazioni