[Oracle] 2 requetes faisant la meme chose, deux résultats differents

2 requetes faisant la meme chose, deux résultats differents [Oracle] - SQL/NoSQL - Programmation

Marsh Posté le 01-10-2007 à 18:14:50    

Bonjour,

 

Si y a un bon expert ici :

 

Contexte : recuperer dans une table tous les contrats ne se trouvant pas dans une autre

Code :
  1. select id_prosp_unique from tapvcontrat
  2. minus
  3. select a.id_prosp_unique
  4. from tapvcontrat a
  5. ,taepcontrat c
  6. where a.id_prosp_unique = c.id_prosp_unique
 
Code :
  1. select a.id_prosp_unique
  2. from tapvcontrat a
  3. where a.id_prosp_unique not in (select id_prosp_unique from taepcontrat)
 


La premiere me revoint des résultats, la deuxieme rien du tout.
Les deux sont du varchar2(15)

 

Si quelqu'un voit le truc


Message édité par Sebastien le 01-10-2007 à 18:23:33
Reply

Marsh Posté le 01-10-2007 à 18:14:50   

Reply

Marsh Posté le 02-10-2007 à 11:12:16    

chelou
 
ceci dit, moi j'utiliserais plutôt : (plus standard que les deux tiennes, et fonctionnel sur n'importe quel sgbd y compris les plus pourris)

Code :
  1. SELECT a.id_prosp_unique
  2. FROM tapvcontrat a
  3. LEFT OUTER JOIN tapecontrat b ON b.id_prosp_unique = a.id_prosp_unique
  4. WHERE b.id_pros_unique IS NULL

Reply

Marsh Posté le 02-10-2007 à 11:13:44    

sinon, teste ta seconde avec un not exists plutôt.
j'ai l'impression (et ça conforte mon hostilité) que le "not in" marche quand il veut et comme il veut, sous oracle du moins)
 

Code :
  1. SELECT a.id_post_unique
  2. FROM tapvcontrat a
  3. WHERE NOT EXISTS (SELECT NULL FROM tapecontrat b ON b.id_post_unique = a.id_post_unique)


Message édité par MagicBuzz le 02-10-2007 à 12:01:14
Reply

Marsh Posté le 02-10-2007 à 11:14:25    

en tout cas, pour moi t'as mis le doigt sur un des nombreux bugs d'Oracle.


Message édité par MagicBuzz le 02-10-2007 à 11:14:42
Reply

Marsh Posté le 02-10-2007 à 11:32:33    

Ah oui tiens j'ai oublié de mettre à jour ici.
Effectivement j'ai testé avec un NOT EXISTS et ca marche parfaitement.

 

Et ta jointure externe aussi marche très bien.

 

J'irais bien dire deux mots à Oracle moi :o


Message édité par Sebastien le 02-10-2007 à 11:33:58
Reply

Marsh Posté le 02-10-2007 à 11:59:55    

On peut faire un voyage groupé si tu veux :lol:

Reply

Marsh Posté le 02-10-2007 à 21:34:07    

gardez moi une place de choix svp [:florentg]

Reply

Marsh Posté le 03-10-2007 à 11:09:49    

c'est vrai que c'est un gros bébés capricieux mais y a souvent moyen de comprendre le pourquoi du comment du résultat bizarre.
tu peux afficher tes clés qui remontent normalement avec la 1ere requete?

Reply

Marsh Posté le 03-10-2007 à 12:11:26    

Je n'ai pas très bien compris ta question, alors je te donne l'EXPLAIN PLAN, c'est peut etre ca que tu veux
 

Citation :


Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
 
SELECT STATEMENT REMOTE Optimizer Mode=CHOOSE  14     20                            
  MINUS                                  
    SORT UNIQUE NOSORT  14   168   3                            
      INDEX FULL SCAN YYYYY.MV_IXPVBTTAPVCONTRAT_INDX2 14   168   1   XXXXX
    SORT UNIQUE NOSORT  23   529   17                            
      NESTED LOOPS  23   529   15                            
        INDEX FULL SCAN YYYYY.MV_IXPVBTTAPVCONTRAT_INDX2 14   168   1   XXXXXXX                        
        INDEX RANGE SCAN YYYYY.INDX_MV_TAEPCONTRAT_IDPUNIQ 2   22   1   XXXXXX


 

Citation :


Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
 
SELECT STATEMENT REMOTE Optimizer Mode=CHOOSE  1     1                            
  INDEX FULL SCAN YYYY.MV_IXPVBTTAPVCONTRAT_INDX2 1   12   1   XXXX
    TABLE ACCESS FULL YYYYY.MV_TAEPCONTRAT 5 K 56 K 536   XXXX
 


 
Ouch le cout :p

Reply

Marsh Posté le 03-10-2007 à 12:25:07    

casimimir a écrit :

c'est vrai que c'est un gros bébés capricieux mais y a souvent moyen de comprendre le pourquoi du comment du résultat bizarre.


c'est une grosse merde bloatée et totalement imprévisible ouais

Reply

Marsh Posté le 03-10-2007 à 12:25:07   

Reply

Marsh Posté le 03-10-2007 à 13:42:53    

perso je n'ai pas vraiment de soucis avec, tout mon dataware house est en oracle, mais bon ce n'est pas comparable a un vrai système de prod vu que mes users ne font que des select (ca c'est le pied) et que je contrôle les mise a jour etc, mais au niveau traitement j'ai rarement des surprises.
 
je pensais plutot au foirage du in a cause de x centaines de millier de key comme membres, je n'ai pas l'habitude de lire les explain plain en text (toad noob), le 2ème chiffre derriere la ligne ressort le résultat  en Kbytes non? parceque ca fait pas mal de varchar(15) ca, bon c'est pas une excuse pour qu'il foire on est bien d'accord :)
 
 
tiens quand tu disais qu'il ne te renvoyait rien du tout, tu parlais bien d'un "0 row returned"?


Message édité par casimimir le 03-10-2007 à 13:43:40
Reply

Marsh Posté le 03-10-2007 à 14:41:37    

je pense aussi que c'est le in qui déconne. (c'est même sûr, c'est pas pour rien qu'Oracle déconseille son utilisation)
 
ceci dit, il devrait au contraire retourner plus de lignes que prévu du coup, alors que là il en ramène pas assez [:magicbuzz]


Message édité par MagicBuzz le 03-10-2007 à 14:42:08
Reply

Marsh Posté le 03-10-2007 à 14:56:27    

Ouais 0 row, et oui il explose les compteurs le not in
5000 records 536 KBytes mais ca j'ai du mal à dechiffrer pour un plan d'execution ce que ca signifie concretement


Message édité par Sebastien le 03-10-2007 à 14:58:11
Reply

Marsh Posté le 03-10-2007 à 15:05:42    

Ca signifie concrètement qu'autant pour certaines fonctionalités, Oracle est extrêment bon, autant pour d'autres, elles ont été développées en QBasic par des stagiaires qui se sont tirés sans écrire de doc, et que plus personne s'ose mettre la main dedans pour corriger les bugs.
 
En gros, Oracle est un des moteurs de base de données les plus puissants, mais avec des limitations qui dépassent celles d'Access 2.0 (je suis pas sûr que j'exagère tant que ça...)

Reply

Marsh Posté le 03-10-2007 à 16:13:10    

une grosse merde quoi... tiens, un truc qui m'arrive régulièrement :
 

Code :
  1. SQL> connect kikoo/mdp@instance as sysdba
  2. SQL> insert into table values (...)
  3. SQL> ORA-01031: insufficient privileges


lolilol non ? et je fais quoi pour résoudre ça ? je reboote le serveur et hop, tout remarche ! même David Copperfield il arrive pas à le faire ça !
en résumé : Copperfield arrive peut être à faire disparaitre un éléphant, mais Oracle arrive à éjecter son sysdba, c'est top [:bien]

Reply

Marsh Posté le 03-10-2007 à 16:17:19    

ca se tient comme résonnement, quand je vois je ne l'utilise carrément jamais des que je dépasse +/- 10 membres, j'irai max jusqu'a 100 mais je me ferai mal je crois.
 
c'est pas comme ca sur tous les sgbd? :)

Reply

Marsh Posté le 03-10-2007 à 16:24:40    

Pas compris ta remarque Casimimir

Reply

Marsh Posté le 03-10-2007 à 16:29:28    

en gros je fais jamais de in sauf si je définis les valeurs litéralement, style in (1,2,3,4), mais très et de plus en plus rarement un sous select dedans, ou alors de nouveau un sous select qui ne va me ramener que très peu de membre et que j'en suis sur


Message édité par casimimir le 03-10-2007 à 16:30:17
Reply

Marsh Posté le 03-10-2007 à 17:22:57    

D'autant qu'un IN est quasi toujours remplaçable par un EXISTS, qui fonctionne beaucoup mieux sous Oracle (pas de limitation du nombre de sous éléments)
 
Ceci dit, quand on a une solution plus propre sous la main, autant l'utiliser.


Message édité par MagicBuzz le 03-10-2007 à 17:23:24
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed