Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/10/2007, 15h30   #1
Nouveau Membre du Club
 
Inscription : août 2006
Messages : 137
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 137
Points : 26
Points : 26
Par défaut Comment Eviter le dual(consommateur)

select count(*) as alias1
From Dual D
WHere exists ( select a.col1, b.col2
From taba a
left outer join tabb b on a.col4=b.col5
where a.col6=2
a.col7=2
a.col8=9
and b.col7=8)
)
cette requete (oracle 9ir2) retourne 1 si le contenu de la sous requete ramene 1 ou plusieurs lignes .
retourne 0 sinon

Voici son plan d''execution


Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1982 Card=1)
1 0 SORT (AGGREGATE)
2 1 FILTER
3 2 TABLE ACCESS (FULL) OF 'DUAL' (Cost=1982 Card=1)
4 2 TABLE ACCESS (BY INDEX ROWID) OF 'Tabb' (Co
st=2 Card=1 Bytes=56)

5 4 NESTED LOOPS (Cost=3 Card=1 Bytes=97)
6 5 TABLE ACCESS (BY INDEX ROWID) OF 'taba' (Cost=2 Car
d=1 Bytes=41)

7 6 INDEX (RANGE SCAN) OF 'INN_taba_10' (NON-UNIQUE)
(Cost=4 Card=2)

8 5 INDEX (RANGE SCAN) OF 'AK_Tabb' (NON-UNIQUE) (Cost=1 Card=1)


queqlu''un a une idée comment eviter le dual(trop consommateur), le principe est d'afficher le resultat 1 quand il ya des lignesramenées par la sous requete et 0 sinon.


Merci d'avance!!!
Mehdilis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 15h53   #2
Membre actif
 
Avatar de Loyd1974
 
Inscription : août 2007
Messages : 176
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 176
Points : 172
Points : 172
Code :
1
2
3
4
5
6
7
8
SELECT 1
                     FROM  taba a
                     LEFT OUTER JOIN tabb b ON a.col4=b.col5
                     WHERE a.col6=2
                     a.col7=2
                     a.col8=9                     
                     AND b.col7=8
AND rownum = 1
Loyd1974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 18h21   #3
Nouveau Membre du Club
 
Inscription : août 2006
Messages : 137
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 137
Points : 26
Points : 26
Merci pour votre reponse, mais le 1 est affiché dans les deux cas, cette transforamtion ne reponds pour le cas vide avec 0,
Mehdilis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 20h03   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
si le coût est si important sur DUAL c'est probablement un problème de stats... dual n'est absolument pas consommateur avec sa colonne unique et sa seule ligne
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2007, 12h30   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 215
Points : 4 215
Reprenons le code de Loyd
Code :
1
2
3
4
5
6
7
SELECT NVL(COUNT(1),0)
FROM  TABA a  LEFT OUTER JOIN TABB b ON a.col4=b.col5
WHERE a.col6=2
AND a.col7=2
AND a.col8=9                     
AND b.col7=8
AND rownum = 1
Renvoie 1 si 1+ ligne, 0 si 0 lignes


PS : Ne pas mettre de nom de colonnes dans un EXISTS.
Code :
WHERE EXISTS (SELECT 1 FROM
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 11h20   #6
Membre actif
 
Avatar de Loyd1974
 
Inscription : août 2007
Messages : 176
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 176
Points : 172
Points : 172
Citation:
Envoyé par Mehdilis Voir le message
Merci pour votre reponse, mais le 1 est affiché dans les deux cas, cette transforamtion ne reponds pour le cas vide avec 0,
Tout dépend comment est utilisé cette requête:
En pl/sql, il suffit juste de jouer avec l'exception no_data_found
En sql pur, aucune valeur ne sera retourné et la variable stockant le résultat vaudra NULL

Expliques nous d'avantage comment cette requête est utilisée au sein de ton traitement, on pourra mieux adapter nos réponses
Loyd1974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h26.


 
 
 
 
Partenaires

Hébergement Web