Bonjour,
Quelqu'un peut-il me dire à quoi sert ce genre de curseur? je ne l'ai pas trouver dans la doc.
Code:
1
2
3
4
5
6 CURSOR cur_a IS WITH table_a AS (SELECT FROM table_b WHERE ....) SELECT .... FROM table_a.....;
Version imprimable
Bonjour,
Quelqu'un peut-il me dire à quoi sert ce genre de curseur? je ne l'ai pas trouver dans la doc.
Code:
1
2
3
4
5
6 CURSOR cur_a IS WITH table_a AS (SELECT FROM table_b WHERE ....) SELECT .... FROM table_a.....;
Bonjour,
La clause WITH s'utilise dans un SELECT, et permet de factoriser une sous-requête, plutôt que de la taper N fois dans une requête.
De plus, l'exécution de la requête est normalement plus rapide, puisque au lieu d'ête exécuter N fois, elle est exécutée 1 seule fois, et le résultat est mis en mémoire (ou dans une table temporaire si il y a trop de volume).
merci
Citation:
Envoyé par rouardg
Nous utilisons une clause WITH dans un curseur avec une requête réalisant une union de 6 SELECT. Le temps de réponses est très long, en replaçant par une vue implicite dans chaque SELECT, la réponse est instantanée...quelqu'un a t'il une explication?
Salut à tous,
En fait ça dépend de la "lourdeur" du Select que tu fait dans la clause WITH et de sa jointure avec le select principal...
Avec la clause WITH, le Select ainsi factorisé est FORCEMENT exécuté pour sa totalité (tous les rows) avant d'être utilisé dans le Select principal.
Par contre, avec la vue en ligne (plus communément inline view) Oracle essaye tout d'abord de TRANSFORMER le select de la vue en ligne en fonction de la (les) jointure(s) sur le Select principal pour n'en faire qu'un seul Select le plus performant possible...
Donc au final c'est la cardinalité et le degré de "restriction" de la jointure utilisée entre les 2 selects qui détermine si il est plus couteux d'utiliser une clause WITH ou une vue en ligne...
Pour résumer, mettre un Select lourd qui va chercher plusieurs milliers le lignes dans une clause WITH pour finalement n'en utiliser qu'une ou deux par la jointure c'est mauvais pour les perf.
Alors que si TOUTES (ou presque) les lignes de ce Select sont à utiliser par la suite, pour des comparaisons dans des clauses IN, ou Exists, ou autre... alors là c'est bien meilleur que la vue en ligne qui devrait refaire ce même Select à chaque fois (à chaque Row) en y incluant la jointure avec le Select principal...
voilà ce que j'en sais et ce que j'ai pu constater à l'usage...
Citation:
Envoyé par Yorglaa
Dans mon cas, le select de la clause with faisait une jointure sur 4 tables pour ne ramener qu'une seule ligne, ça aurait donc dû être plus performant.
Autre question que se passe t'il s'il existe déjà une vue qui porte le même nom que l'alias utilisé dans la clause with? je suppose que la requête utilise l'alias.
Il est difficile d'être aussi catégorique !Citation:
Envoyé par ljoly
parce que ce que je voulais faire comprendre, c'est que c'est L'INTERACTION entre les 2 selects qui est importante... et pas seulement la volumétrie finale (les Rows ramenés) qui est en cause.
Si ton Select factorisé brasse 50 millions de lignes avant de te ramener ce seul Row, alors il sera long...
alors que, si il est directement mis en jointure dans le Select principal, cette jointure est peut-être justement assez "discriminante" pour que ce même select ne brasse plus que 2000 lignes pour te ramener ce même Row...
hummm je serais tenté de dire que le Select entre le parenthèses du WITH ne voit pas les éléments du Select principal... PAR CONTRE TOUS les éléments du Select principal, y compris une vue en ligne verront la requêtes factorisé par l'alias définit pasr la clause WITH.Citation:
Envoyé par ljoly
du coup, et dans un soucis de relecture, je te conseillerais d'avoir des alias différenciés.