Partilhar via


SR0015: Extrair a chamadas de função determinista onde predicados

RuleId

SR0015

<strong>Categoria</strong>

Microsoft.Performance

Alteração significativa

Não-separável

Causa

Um predicado onde contém uma ou mais chamadas de função determinista.

Descrição da regra

Em um predicado de onde uma chamada de função é determinística se seu valor não depende dos dados selecionados. Essas chamadas poderiam causar varreduras de tabela desnecessários, o que diminuem o desempenho do banco de dados.

Como corrigir violações

Para resolver esse problema, você pode atribuir o resultado da chamada para uma variável que você usa no predicado onde.

Quando suprimir avisos

Você pode suprimir esse aviso se a tabela ou tabelas que o predicado onde referencia nunca conterá mais de algumas linhas.

Exemplo

No primeiro exemplo, o procedimento armazenado inclui uma chamada de função determinista, ABS(@param1), no predicado onde. No segundo exemplo, uma variável temporária contém o resultado da chamada.

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

Consulte também

Conceitos

Analisando o código do banco de dados para melhorar a qualidade do código