Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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