SR0015: Extraer las llamadas de función deterministas de predicados WHERE

Identificador de regla

SR0015

Categoría

Microsoft.Performance

Cambio problemático

Poco problemático

Causa

Un predicado WHERE contiene una o más llamadas de función deterministas.

Descripción de la regla

En un predicado WHERE, una llamada de función es determinista si su valor no depende de los datos seleccionados. Tales llamadas podrían producir recorridos de tabla innecesarios que reducen el rendimiento de la base de datos.

Cómo corregir infracciones

Para resolver este problema, puede asignar el resultado de la llamada a una variable que utilice en el predicado WHERE.

Cuándo suprimir advertencias

Podría suprimir esta advertencia si la tabla o las tablas a las que hace referencia el predicado WHERE nunca contendrán más que unas pocas filas.

Ejemplo

En el primer ejemplo, el procedimiento almacenado incluye una llamada de función determinista, ABS(@param1), en el predicado WHERE. En el segundo ejemplo, una variable temporal contiene el resultado de la llamada.

CREATE PROCEDURE [dbo].[Procedure2WithWarning]
@param1 INT = 0, 
AS
BEGIN
SELECT [c1], [c2], [c3], [SmallString] 
FROM [dbo].[Table1]
WHERE [c2] > ABS(@param1)
END

CREATE PROCEDURE [dbo].[Procedure2Fixed]
@param1 INT = 0, 
AS
BEGIN
DECLARE @AbsOfParam1 INT
SET @AbsOfParam1 = ABS(@param1)

SELECT [c1], [c2], [c3], [SmallString] 
FROM [dbo].[Table1]
WHERE [c2] > @AbsOfParam1
END

Vea también

Conceptos

Analizar el código de base de datos para mejorar la calidad del código