Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Chiamata di funzione in clausola where

Come al solito con SQL, la query è in gran parte irrilevante senza sapere che lo schema effettivo viene utilizzato.

Hai un indice su Members.Phone? Se no, non fa differenza come scrivi la query, tutti analizzeranno l'intera tabella e si esibiranno allo stesso modo (ad es. si esibiranno male). Se hai un indice quindi il modo in cui scrivi la query fa la differenza:

SELECT * FROM Members WHERE Phone= @Phone;
SELECT * FROM Members WHERE Phone= dbo.FormatPhone(@Phone);
SELECT * FROM Members WHERE  dbo.FormatPhone(Phone)[email protected];

La prima query è garantita ottimale, cercherà il telefono sull'indice.
La seconda query dipende dalle caratteristiche del dbo.FormatPhone. Può utilizzare o meno una ricerca ottimale.
È garantito che l'ultima query non è valida. Scansionerà il tavolo.

Inoltre, ho rimosso il suggerimento NOLOCK, sembra il tema del giorno... Vedi sintassi per nolock in sql . NOLOCK è sempre la risposta sbagliata. Usa l'isolamento delle istantanee.