Performance requête dynamique
Bonjour,
J'ai ecrit une procedure stockee qui construit une requete dynamiquement et qui l'execute via
Citation:
EXEC sp_executesql @SQL, @PARAM
.
Cela fonctionne et me retourne un resultat en 12 secondes mais quand je lance la meme requete que celle generee le resultat est trouve en 1 seconde !
J'ai vu que cela pouvait provenir du sniffing de parametre et qu'il fallait utiliser l'option
Citation:
OPTION (OPTIMIZE FOR UNKNOWN)
mais cela ne change pas grand chose.
D'autre part j'utilise une function table (Inline Table). J'ai essaye d'enlever la jointure sur cette function table, la difference d'execution est moins importante (3s VS 1s) mais il reste un ecart.
Je sais plus vraiment ou chercher, auriez-vous une piste ?
Ci joint la requete (simplifiee) generee
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
SELECT STATFAM.CODE,
frm_MAIN.*,
( CA_2016 - CA_2015 ) / NULLIF(CA_2015, 0) * 100
FROM (SELECT CRITERE1,
Sum(CA_2015) AS CA_2015,
Sum(CA_2016) AS CA_2016,
Grouping(CRITERE1) AS GRPCRITERE1
FROM (SELECT udv_MAIN.STATFAM_ID AS CRITERE1,
DATA + '_' + CONVERT(char(4), ANNEE) AS COL,
VALUE
FROM dashboard.udv_MAIN
JOIN (SELECT STATFAM_ID
FROM dbo.udf_SplitRange('05;06') R
JOIN dashboard.STATFAM
ON STATFAM.CODE BETWEEN R.DEBUT AND R.FIN)
FCFAM1
ON FCFAM1.STATFAM_ID = udv_MAIN.STATFAM_ID
WHERE ( ( udv_MAIN.DATEFACTURE BETWEEN
Dateadd(YEAR, -1, '2016-01-01')
AND
Dateadd(YEAR, -1, '2016-12-31') )
OR ( udv_MAIN.DATEFACTURE BETWEEN
'2016-01-01' AND '2016-12-31'
) )
) SRC
PIVOT (Sum(VALUE)
FOR COL IN ( [CA_2015],
[CA_2016] )) PIV
GROUP BY ROLLUP( CRITERE1 )
) AS frm_MAIN
LEFT JOIN dashboard.STATFAM
ON STATFAM.STATFAM_ID = frm_MAIN.CRITERE1
ORDER BY frm_MAIN.GRPCRITERE1,
STATFAM.CODE
OPTION (OPTIMIZE FOR UNKNOWN) |