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é