Optimiser les requêtes

J'ai la fonction suivante

CREATE FUNCTION [dbo].[SuiviRupture] (@CodeArticle [NVARCHAR](13), @CodeSite [NVARCHAR](5), @CodeStructure [NVARCHAR](13)) RETURNS @calcul TABLE (CAMOY FLOAT, QTEMOY FLOAT) AS BEGIN WITH temp AS ( SELECT t1.[datecol], t1.[Prix de vente TTC], t1.Quantité FROM [V_VentePromo] t1 INNER JOIN (SELECT DISTINCT [datecol], [Code Article], [Code Structure], [Code Site], ROW_NUMBER() OVER(PARTITION BY [Code Article], [Code Structure], [Code Site] ORDER BY [datecol] DESC) AS rn FROM (SELECT DISTINCT [datecol], [Code Article], [Code Structure], [Code Site] FROM [V_VentePromo] t2 WHERE [Code Article] = @CodeArticle AND [Code Site] = @CodeSite AND [Code Structure] = @CodeStructure) g ) a ON a.datecol = t1.datecol AND t1.[Code Article] = a.[Code Article] AND t1.[Code Structure] = a.[Code Structure] AND t1.[Code Site] = a.[Code Site] WHERE t1.[Code Article] = @CodeArticle AND t1.[Code Site] = @CodeSite AND t1.[Code Structure] = @CodeStructure AND rn <= 28 ) INSERT @calcul SELECT CASE WHEN COUNT(distinct [datecol]) = 0 THEN 0 ELSE SUM(convert(float, Quantité)) / count(distinct [datecol]) END as QTEMOY, CASE WHEN COUNT(distinct [datecol]) = 0 THEN 0 ELSE SUM(convert(float, [Prix de vente TTC])) / count(distinct [datecol]) END AS CAMOY FROM temp RETURN; END; 

J'appelle cette fonction par cette requête

 SELECT t1.[Code Article], t1.[Code Site], t1.[Code Structure], u.QTEMOY, u.CAMOY FROM V_distinctVente t1 CROSS APPLY dbo.[SuiviRupture](t1.[Code Article], t1.[Code Site], t1.[Code Structure]) u 

entrez la description de l'image ici

Le time d'exécution est trop long, j'ai un nombre de lignes de V_distinctVente d'environ 10 000 000. Comment optimiser Icombine requête principale avec le code T-SQL de la TVF dans une requête? Il est exécuté rangée par rangée dans le requête principale

Votre fonction peut très facilement être transformée en TVF en ligne . Le vieux TVF avec BEGIN … END a besoin d'une déclaration de table et est connu pour de très mauvaises performances.

Autre le TVF en ligne (ou TVF ad-hoc ): Ceci est entièrement en ligne et se comporte comme une VUE. Essayez-le comme ceci:

 CREATE FUNCTION [dbo].[SuiviRupture](@CodeArticle [NVARCHAR](13),@CodeSite [NVARCHAR](5) ,@CodeStructure [NVARCHAR](13)) RETURNS TABLE AS RETURN WITH temp AS ( SELECT t1.[datecol],t1.[Prix de vente TTC],t1.Quantité FROM [V_VentePromo] t1 INNER JOIN (SELECT DISTINCT [datecol],[Code Article],[Code Structure],[Code Site], ROW_NUMBER() OVER(PARTITION BY [Code Article],[Code Structure],[Code Site] ORDER BY [datecol]desc ) AS rn FROM (SELECT DISTINCT [datecol],[Code Article],[Code Structure],[Code Site] FROM [V_VentePromo] t2 WHERE [Code Article]= @CodeArticle AND [Code Site]=@CodeSite AND [Code Structure]=@CodeStructure )g ) a ON a.datecol=t1.datecol AND t1.[Code Article] = a.[Code Article] AND t1.[Code Structure]=a.[Code Structure] AND t1.[Code Site]=a.[Code Site] WHERE t1.[Code Article]= @CodeArticle AND t1.[Code Site]=@CodeSite AND t1.[Code Structure]=@CodeStructure AND rn <= 28 ) SELECT CASE WHEN COUNT(DISTINCT [datecol]) =0 THEN 0 ELSE SUM(CONVERT(FLOAT,Quantité))/COUNT(DISTINCT [datecol]) END AS QTEMOY , CASE WHEN COUNT(DISTINCT [datecol]) =0 THEN 0 ELSE SUM(CONVERT(FLOAT,[Prix de vente TTC])) / COUNT(DISTINCT [datecol])END AS CAMOY FROM temp ; GO