SR0015: Deterministische Funktionsaufrufe aus WHERE-Prädikaten extrahieren

Regel-ID

SR0015

Kategorie

Microsoft.Performance

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Ein WHERE-Prädikat enthält einen oder mehr deterministische Funktionsaufrufe.

Regelbeschreibung

In einem WHERE-Prädikat ist ein Funktionsaufruf deterministisch, wenn sein Wert nicht von den ausgewählten Daten abhängt. Solche Aufrufe können unnötige Tabellenscans verursachen, die zu Lasten der Datenbankleistung gehen.

Behandeln von Verstößen

Um dieses Problem zu beheben, können Sie das Ergebnis des Aufrufs einer Variable zuweisen, die Sie im WHERE-Prädikat verwenden.

Wann sollten Warnungen unterdrückt werden?

Sie können diese Warnung unterdrücken, wenn die Tabelle oder die Tabellen, auf die das WHERE-Prädikat verweist, immer nur einige Zeilen enthalten.

Beispiel

Im ersten Beispiel schließt die gespeicherte Prozedur einen deterministischen Funktionsaufruf (ABS(@param1)) im WHERE-Prädikat ein. Im zweiten Beispiel enthält eine temporäre Variable das Ergebnis des Aufrufs.

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

Siehe auch

Konzepte

Analysieren von Datenbankcode zum Verbessern der Codequalität