SR0015 : Extrayez les appels de fonction déterministe à partir des prédicats WHERE

Id de la règle

SR0015

Catégorie

Microsoft.Performance

Modification avec rupture

Modification sans rupture

Cause

Un prédicat WHERE contient un ou plusieurs appels de fonction déterministes.

Description de la règle

Dans un prédicat WHERE, un appel de fonction est déterministe si sa valeur ne dépend pas des données sélectionnées. De tels appels pourraient provoquer des analyses de table inutiles, ce qui diminuerait la performance des bases de données.

Comment corriger les violations

Pour résoudre ce problème, vous pouvez assigner le résultat de l'appel à une variable que vous utilisez dans le prédicat WHERE.

Quand supprimer les avertissements

Vous pouvez supprimer cet avertissement si la ou les tables auxquelles le prédicat WHERE fait référence ne contiennent que quelques lignes.

Exemple

Dans le premier exemple, la procédure stockée inclut un appel de fonction déterministe, ABS (@ param1), dans le prédicat WHERE. Dans le deuxième exemple, une variable temporaire contient le résultat de l'appel.

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

Voir aussi

Concepts

Analyse du code de base de données pour en améliorer la qualité