Bonjour,
J'ai remarqué une chose étrange en essayant d'optimiser une de mes requêtes. Dans une requête imbriquée je fais un test sur un champ pour ne sélectionner que les lignes qui ont l'ID qui m'intéresse.
Normalement j'utilise une variable pour stocker l'ID que je veux tester (qui correspond en fait à une constante), et j'utilise donc cette variable dans ma requête.
Quand j'exécute cette requête, le temps d'exécution est d'environ 9 secondes.
Maintenant si je remplace la variable de ma requête directement par la valeur, le temps d'éxécution chute à 1 seconde !!!
Et en regardant le plan d'éxécution, je constate que le schéma est très différent entre les deux requêtes.
Dans la version 'variable', les tuples sont filtrés en fait beaucoup plus tard que dans la version 'valeur' où ils sont filtrés quasiment au début. Et vue le nombre d'enregistrement que j'ai dans mes tables, la différence de temps peut s'expliquer ainsi.
Je précise que cette variable sert à filtrer les lignes de la table elle même, tandis que dans cette même requête j'utilise une autre variable pour filtrer les lignes d'une jointure, et là ça n'a pas d'influence.
Dans la requête ci-dessous, la variable @A est celle qui n'influence pas.
C'est la variable @B que je change avec sa valeur pour obtenir un temps de 1 seconde.
Donc en fait ma question est:
Mais pourquoi donc ?
et
N'y aurait-il pas moyen d'utiliser quand même la variable plutôt que la valeur, tout en ayant un temps d'éxécution record ?
Voilà la requête (simplifiée) que j'utilise:
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 SELECT H3.* FROM ( SELECT H2.* FROM ( SELECT H.* FROM VUE H JOIN TABLE T2 ON ... WHERE T2.ID = @A AND H.PROD_ELT_ID = @B ) AS G JOIN HISTO H2 ON ... AND ... AND ... ) AS P JOIN HISTO H3 ON ... JOIN T_CAT ON ... JOIN (HISTO A JOIN RELATION ON ...) ON ... AND ... AND ... JOIN T_CST ON ... WHERE ...
Partager