テーブル値のインライン UDF があります。その UDF の結果をフィルタリングして、1 つの特定の値を取得したいと考えています。定数パラメーターを使用してフィルターを指定すると、すべてが素晴らしく、パフォーマンスはほぼ瞬時になります。変数パラメーターを使用してフィルターを指定すると、論理読み取りが 500 倍、期間が 20 倍になるという、非常に大きな時間がかかります。
実行計画は、変数パラメーターの場合、プロセスの非常に遅い時間までフィルターが適用されず、定数の場合に実行されるシークではなく、複数のインデックス スキャンが発生することを示しています。
私の質問は次のとおりだと思います:インデックス付きフィールドに対して非常に選択的な単一のフィルターパラメーターを指定しているため、そのパラメーターが変数にあるとパフォーマンスが低下するのはなぜですか? これについて私にできることはありますか?
クエリの分析関数と関係がありますか?
ここに私の質問があります:
CREATE FUNCTION fn_test()
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
SELECT DISTINCT GCN_SEQNO, Drug_package_version_ID
FROM
(
SELECT COALESCE(ndctbla.GCN_SEQNO, ndctblb.GCN_SEQNO) AS GCN_SEQNO,
dpv.Drug_package_version_ID, ROW_NUMBER() OVER (PARTITION BY dpv.Drug_package_version_id ORDER BY
ndctbla.GCN_SEQNO DESC) AS Predicate
FROM dbo.Drug_Package_Version dpv
LEFT JOIN dbo.NDC ndctbla ON ndctbla.NDC = dpv.Sp_package_code
LEFT JOIN dbo.NDC ndctblb ON ndctblb.SPC_NDC = dpv.Sp_package_code
) iq
WHERE Predicate = 1
GO
GRANT SELECT ON fn_test TO public
GO
-- very fast
SELECT GCN_SEQNO
FROM dbo.fn_test()
WHERE Drug_package_version_id = 10000
GO
-- comparatively slow
DECLARE @dpvid int
SET @dpvid = 10000
SELECT GCN_SEQNO
FROM dbo.fn_test()
WHERE Drug_package_version_id = @dpvid