J'ai un UDF en ligne, évalué par table. Je veux filtrer les résultats de cette UDF pour obtenir une valeur particulière. Quand je spécifie le filtre en utilisant un paramètre constant, tout est génial et la performance est presque instantanée. Lorsque je spécifie le filtre à l'aide d'un paramètre variable, cela prend beaucoup plus de temps, de l'ordre de 500 lectures plus logiques et 20 fois plus longues. Le plan d'exécution montre que dans le cas de paramètre variable, le filtre n'est appliqué que très tard dans le processus, provoquant plusieurs analyses d'index plutôt que les recherches effectuées dans le cas constant. Je suppose que mes questions sont les suivantes: Pourquoi, étant donné que je spécifie un seul paramètre de filtre qui va être très sélectif par rapport à un champ indexé, mes performances vont-elles dans les mauvaises herbes quand ce paramètre est dans une variable? Y a-t-il quelque chose que je puisse faire à ce sujet?Pourquoi la fonction UDF de ma table en ligne est-elle beaucoup plus lente lorsque j'utilise des paramètres variables plutôt que des paramètres constants?
Cela a-t-il quelque chose à voir avec la fonction analytique dans la requête?
Voici mes questions:
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
Pouvez-vous publier les deux plans d'exécution quelque part afin que je puisse voir exactement ce que fait SQL Server dans les deux cas? – mrdenny