Bonjour,
Je travaille sur Oracle 10i.
Je cherche à optimiser une requête d'insertion de données dans une table temporaire en vue d'une application web. Voici ma requête initiale :
INSERT INTO table_tmp
SELECT M.col1, sum(M.col2)
FROM
(SELECT col1,col2
FROM table1
WHERE cond1) M
GROUP BY M.col1;
Les données servant à alimenter cette table sont issues d'une requête de sélection (en vert) relativement coûteuse en temps d'exécution : environ 25 secondes.
J'ai réussi à optimiser nettement cette requête en utilisant une expression de table commune, autrement dit une syntaxe du type :
Je suis en effet arrivé à 9 secondes seulement.WITH M AS
(SELECT col1,col2
FROM table1
WHERE cond1)
SELECT col1, sum(col2)
FROM M
GROUP BY col1;![]()
Tout content, je me dis qu'il ne me reste alors qu'à rajouté le insert
into pour alimenter ma table temporaire :
Et là surprise : la requête met 28 secondes !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 INSERT INTO table_tmp WITH M AS (SELECT col1,col2 FROM table1 WHERE cond1) SELECT col1, sum(col2) FROM M GROUP BY col1;![]()
Autant dire que l'utilisation de la clause WITH devient inutile !
J'ai beau cherché, je ne comprends pas pourquoi l'alimentation de la table induit un tel temps d'exécution alors que la seule sélection avec la clause WITH permet un gain de temps considérable par rapport à la requête initiale !?
Quelqu'un peut-il me donner une solution ou au moins une explication ?
PS : pour plus de renseignement sur l'utilisation de la clause WITH, vous pouvez aller voir ici : http://www.ianywhere.com/developer/p...s-5414852.html et http://www.ianywhere.com/developer/p...s-7010660.html
Je rentre bien dans les cas d'utilisation de cette clause et rien n'indique que ça induit un temps d'exécution plus long pour le cas de l'INSERT...
Partager