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.
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.
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 terribleEnvoyé par SheikYerbouti
j'ai ma petite idée sur la réponseEnvoyé par SheikYerbouti
Il fallait bien que cela soit évident pour tout le monde
en fait ça marche bien , sauf que ça devrait ressembler à ça en fait ...
ou ou peut être...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Select .... Where exists ( select 1 from ma_table where .... )
en fait ..
ça marche ... et en plus c'est pas mal rapide quand même
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 !
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 ?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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part Select * from EMP where deptno IN ('10','20','30','50')
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager