sql >> Base de Datos >  >> RDS >> Sqlserver

Llamada de función en cláusula where

Como es habitual con SQL, la consulta es en gran medida irrelevante sin conocer el esquema real contra el que se utiliza.

¿Tiene un índice en Members.Phone? Si no, entonces no importa cómo escriba la consulta, todos escanearán toda la tabla y realizarán lo mismo (es decir, funcionarán mal). Si tiene un índice entonces la forma en que escribes la consulta marca la diferencia:

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

La primera consulta se garantiza óptima, buscará el teléfono en el índice.
La segunda consulta depende de las características del dbo.FormatPhone. Puede o no utilizar una búsqueda óptima.
Se garantiza que la última consulta será incorrecta. Escaneará la tabla.

Además, eliminé la sugerencia de NOLOCK, parece el tema del día... Ver sintaxis para nolock en sql . NOLOCK es siempre la respuesta incorrecta Utilice el aislamiento de instantáneas.