No puede contar con el orden en que una base de datos evaluará las expresiones de filtrado. Hay un optimizador de consultas que evaluará su SQL y creará un plan para ejecutar la consulta en función de lo que percibe que producirá el mejor rendimiento .
En este contexto, IsNumeric()
no se puede usar con un índice, y significa ejecutar una función en cada fila de la tabla. Por lo tanto, casi nunca proporcionar el mejor rendimiento percibido. Compare esto con el SrcID > 15
expresión, que puede coincidir con un índice (si existe), y es solo una expresión de un solo operador, incluso si no existe. También se puede usar para filtrar el número de posibles filas donde IsNumeric()
la función necesita ejecutarse.
Es probable que pueda evitar esto con una vista, una subconsulta, un CTE, una instrucción CASE o una columna calculada. Aquí hay un ejemplo de CTE:
With NumericOnly As
(
SELECT <columns> FROM MyTable WHERE IsNumeric(SrcID) = 1
)
SELECT <columns> FROM NumericOnly WHERE SrcID > 15
Y aquí hay una opción de declaración CASE:
SELECT <columns> FROM MyTable WHERE CASE WHEN IsNumeric(SrcIC) = 1 THEN Cast(SrcID As Int) ELSE 0 END > 15