perso (et pour recentrer un peu le sujet) je viens d'essayer la solution proposée, et c'est franchement plus rapide ( à peu près dix fois plus),
merci donc de votre aide.
Version imprimable
perso (et pour recentrer un peu le sujet) je viens d'essayer la solution proposée, et c'est franchement plus rapide ( à peu près dix fois plus),
merci donc de votre aide.
Laquelle ?
yep, le plan d'exécution est exactement le même, j'ai même essayé USE_NL(a,b) parce que j'avais un doute sur la syntaxe mais pas de différence... Si je force l'accés sur la PK de table_1 c'est pareil, c'est pas terrible :?Citation:
Envoyé par SheikYerbouti
j'ai ma petite idée sur la réponse :roi:Citation:
Envoyé par SheikYerbouti
celle utilisant EXISTS...
:yaisse3:
Il fallait bien que cela soit évident pour tout le monde :wink:
en fait ça marche bien , sauf que ça devrait ressembler à ça en fait ...
ou ou peut être...Code:
1
2
3
4
5
6
7 Delete TABLE_1 where exists (select TABLE_1.CLEF from TABLE_2 , TABLE_3 where TABLE_2.CLEF = TABLE_3.CLEF and TABLE_1.CLEF = TABLE_2.CLEF)
dans les deux cas ça prend et temps fou, et pour tout dire je ne suis pas que le résultat obtenu soit valable.Code:
1
2
3
4
5
6
7
8 Delete TABLE_1 where exists (select TABLE_1.CLEF from TABLE_2 , TABLE_3 where TABLE_2.CLEF = TABLE_3.CLEF and TABLE_1.CLEF = TABLE_2.CLEF and TABLE_1.CLEF = TABLE_3.CLEF)
Le EXISTS est malheureusement trop souvent oublié :?
Pourtant il remplace souvent avantageusement un IN... qu'on se le dise :)
La fonction EXISTS retourne un Boolean donc TRUE ou FALSE
La syntaxe habituelle est du type :
Code:
1
2
3 Select .... Where exists ( select 1 from ma_table where .... )
oui... mais encore 8O
en fait ..
ça marche ... et en plus c'est pas mal rapide quand mêmeCode:
1
2
3
4
5
6
7
8
9 Delete TABLE_1 where exists (select TABLE_1.CLEF from TABLE_2 where TABLE_2.CLEF = TABLE_1.CLEF ) and exists (select TABLE_1.CLEF from TABLE_3 where TABLE_3.CLEF = TABLE_1.CLEF)
Pourquoi si la clause exists est toujours plus rapide, la clause in existe-t-elle ?
NB: Mes remarques sur les indexes avec clause in et clause exists étaient valables pour l'optimiser RBO. Et je peux vous garantir que sur des colonnes indexées, je préfère la clause in car il n'y a pas photo en matière de performance. Je ne connais pas bien l'optimiseur CBO.
Je travaille sur un progiciel de compta, j'ai une table des mouvements qui peut contenir par exercice plusieurs millions de lignes et quand je fais des sous-requêtes je vérifie bien que je prends des colonnes indexées, sinon on peut passer à plusieurs heures de traitement...
Le IN existe parce qu'il ne fait simplement pas la même chose que le exists et peut alors rendre de bons services :)
Le RBO n'est plus maintenu par Oracle et commence donc à être sacrément obsoléte... faudrait quand même penser à passer au CBO ;)
Oui je sais que le RBO n'est plus maintenu, mais en progiciel, tu ne peux pas faire évoluer tous tes clients a la même vitesse, donc on est obligé d'être compatible avec tous... Mais on y viendra au CBO ! :wink:
Par contre paux-tu me donner un exemple de différence entre in et exists parce que je ne vois pas ce que tu peux faire avec in que tu ne peux pas faire avec exists ?
n'était-ce pas votre question ?Citation:
Envoyé par PlaineR
Ben, je ne vois pas dans quel cas cela influe différemment sur la reqête principale...
Pouvez-vous me donner un exemple ?
Le résultat attendu n'est pas le même.
EXISTS(), comme je le disais précedement retourne un BOOLEAN, donc aucune donnée réelle. cette fonction sert de test d'existence (d'ou son nom)
IN retourne TOUTES les lignes
L' avantage de EXISTS() est que la recherche s'arrête dès la première occurence trouvée et il n'est donc pas nécessaire de balayer l'ensemble de la table.
Oui, je suis d'accord avec vous sur la différence technique entre exists et in, mais je ne vois pas la différence de conséquence sur la requête principale :
- si j'ai les données suivantes dans col1 la table_1 : 0,1,0,1
- si j'ai les données suivantes dans col2 la table_2 : 0,1,2,3
que je fasse :
ou que je fasse :Code:
1
2
3
4 select col1 from table_1 where exists (select null from table_2 where col_1 = col_2)
la liste des valeurs ramenées sera la même...Code:
1
2
3
4 select col1 from table_1 where col_1 in (select col_2 from table_2)
...Humpf.......
Alors traduisez la requête suivante avec la fonction EXISTS (sans utiliser IN)
Code:Select * from EMP where deptno IN ('10','20','30','50')