Bonjour,

J'ai ecrit une procedure stockee qui construit une requete dynamiquement et qui l'execute via
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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)