Поделиться через


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

См. также

Основные понятия

Анализ кода базы данных с целью улучшения качества кода