Esaminiamo queste due affermazioni:
IF (CONDITION 1) OR (CONDITION 2)
...
IF (CONDITION 3) AND (CONDITION 4)
...
Se lo CONDITION 1
è TRUE
, lo faràCONDITION 2
controllato?
Se lo CONDITION 3
è FALSE
, verrà CONDITION 4
controllato?
Che dire delle condizioni WHERE
: il motore di SQL Server ottimizza tutte le condizioni in aWHERE
clausola? I programmatori dovrebbero collocare le condizioni nel giusto ordine per essere sicuri che l'ottimizzatore di SQL Server lo risolva nel modo giusto ?
AGGIUNTO:
Grazie a Jack per il collegamento, sorpresa dal codice t-sql:
IF 1/0 = 1 OR 1 = 1
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
IF 1/0 = 1 AND 1 = 0
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
Non c'è rilancio a questo caso genera un'eccezione Dividi per zero .
CONCLUSIONE:
Se C ++ / C # / VB presenta un corto circuito, perché SQL Server non può averlo?
Per rispondere veramente a questo, diamo un'occhiata a come entrambi funzionano con le condizioni. C ++ / C # / VB hanno tutti un corto circuito definito nelle specifiche della lingua per accelerare l'esecuzione del codice. Perché preoccuparsi di valutare le condizioni N OR quando la prima è già vera o le condizioni M AND quando la prima è già falsa.
Come sviluppatori, dobbiamo essere consapevoli del fatto che SQL Server funziona in modo diverso. È un sistema basato sui costi. Per ottenere il piano di esecuzione ottimale per la nostra query, il processore di query deve valutare ogni condizione in cui e assegnargli un costo. Questi costi vengono quindi valutati nel loro insieme per formare una soglia che deve essere inferiore alla soglia definita che SQL Server ha per un buon piano. Se il costo è inferiore alla soglia definita, viene utilizzato il piano, in caso contrario l'intero processo viene ripetuto nuovamente con una diversa combinazione di costi di condizione. Il costo qui è una scansione o una ricerca o un join unione o un hash join ecc ... Per questo motivo il corto circuito come è disponibile in C ++ / C # / VB semplicemente non è possibile. Potresti pensare che forzare l'uso dell'indice su una colonna sia considerato un corto circuito, ma non è così. Impone solo l'uso di quell'indice e con ciò accorcia l'elenco dei possibili piani di esecuzione. Il sistema è ancora basato sui costi.
Come sviluppatore devi essere consapevole che SQL Server non esegue i cortocircuiti come avviene in altri linguaggi di programmazione e non c'è niente che puoi fare per forzarlo.