SR0015: вызовы детерминированной функции следует извлекать из предикатов WHERE
Идентификатор RuleId |
SR0015 |
Категория |
Microsoft.Performance |
Критическое изменение |
Не критическое |
Причина
Предикат WHERE содержит один или несколько вызовов детерминированных функций.
Описание правила
В предикате WHERE вызов функция является детерминированным, если его значение не зависит от выбранных данных. Такие вызовы могут вызвать проверку ненужных таблиц и тем самым снизить производительность базы данных.
Устранение нарушений
Чтобы устранить эту проблему, можно записать результат вызова в переменную, которая используется в предикате WHERE.
Отключение предупреждений
Можно отключить это предупреждение, если таблица или таблицы, на которые ссылается предикат WHERE, никогда не будут содержать большое количество строк.
Пример
В первом примере хранимая процедура включает детерминированный вызов функции ABS(@param1) в предикате WHERE. Во втором примере временная переменная содержит результат вызова.
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