Bonjour,
Soit les procédures suivantes qui s'éxécutent séquentiellement de la manière suivante :
1. j'ai une procédure stockée qui créent dynamiquement des tables t1, t2 qu'elles remplient.
2. Ensuite, une procédure stockée crée dynamiquement une fonction inline fct1 me renvoyant une table résultat d'une jointure de 2 tables
SELECT ...
FROM table1 t1 INNER JOIN table2 t2 ON t1.cle = t2.cle
WHERE ....
3. une autre procédure stockée crée dynamiquement une table t3 qu'elle initialise
4. Une procédure stockée crée dynamiquement une deuxieme fonction inline fct2 me renvoyant une table jointure d'une table et de ma fonction fct1.
SELECT ....
FROM fct1 f1 INNERJOIN table3 t3 ON f1.cle = t3.cle
WHERE ....
5. Enfin une procédure stockée effectue un group by sur ma fonction fct2.
SELECT champ1, champ2, count(*)
FROM fct2
GROUB BY champ1, champ2
Le pb est que ce group by est bcp trop long par rapport aux contraintes que j'ai. J'ai donc analysé mes requetes pour voir de quelle manière je pourrais optimiser. J'ai ecrit un exemple de ma fonction fct2 pour voir le plan d'éxécution complet en écrivant :
SELECT champ1, champ2, count(*)
FROM table t1
INNER JOIN table t2 ON ....
INNER JOIN table t3 ON ....
WHERE [conditions fct1] AND [conditions fct2]
GROUP BY champ1, champ2
Et là ma requete est instantanée ! De plus une fois cette requete exécutée, l'éxécution du group by sur ma fonction devient aussi instantanée ( plus de pb de lenteur)... Le pb revient à chaque fois que je repart de l'étape n°1 ( drop et create de mes tables sources ).
J'utilise des fonctions mais je me suis aperçu que j'aurai pu utiliser des vues, y-a t'il une différence au niveau des performances ( sachant que le contenu de mes tables sources est variable ) ?
merci pour toute aide
Partager