次の方法で共有


SR0015: WHERE 述語から確定的な関数呼び出しを抽出します

RuleId

SR0015

カテゴリ

Microsoft.Performance

互換性に影響する変更点

なし

原因

WHERE 述語に 1 つ以上の確定的な関数呼び出しが含まれています。

規則の説明

WHERE 述語では、値が選択したデータに依存しない場合、関数呼び出しは確定的です。 このような呼び出しでは不必要なテーブル スキャンが生じ、データベースのパフォーマンスが低下する可能性があります。

違反の修正方法

この問題を解決するには、呼び出しの結果を WHERE 述語で使用する変数に割り当てます。

警告を抑制する状況

WHERE 述語が参照するテーブルに含まれる行が数行のみである場合は、この警告を抑制してかまいません。

使用例

最初の例では、ストアド プロシージャの WHERE 述語に確定的な関数呼び出し ABS(@param1) が含まれています。 2 番目の例では、一時変数に呼び出しの結果が格納されます。

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

参照

概念

スタティック分析によるデータベース コードの改善