Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Appel de fonction dans la clause where

Comme d'habitude avec SQL, la requête est en grande partie non pertinente sans que l'on sache que le schéma réel est utilisé.

Avez-vous un index sur Members.Phone ? Si non, la façon dont vous écrivez la requête ne fait aucune différence, ils vont tous scanner toute la table et effectuer la même chose (c'est-à-dire mal). Si vous avez un index alors la façon dont vous écrivez la requête fait toute la différence :

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

La première requête est garantie optimale, cherchera le téléphone sur l'index.
La deuxième requête dépend des caractéristiques du dbo.FormatPhone. Il peut ou non utiliser une recherche optimale.
La dernière requête est garantie d'être mauvaise. Va scanner le tableau.

De plus, j'ai supprimé l'indice NOLOCK, cela semble être le thème du jour... Voir syntaxe pour nolock en sql . NOLOCK est toujours la mauvaise réponse. Utiliser l'isolement d'instantané.