jointure ou requete imbriquée ?

jointure ou requete imbriquée ? - SQL/NoSQL - Programmation

Marsh Posté le 01-07-2003 à 23:40:07    

yop,
 
 
 
j'ai par exemple une table avec disons 1000 éléments (100 joueurs et 10 tournois)
 
 


[g]joueur[/g]       [g]point[/g]     [g]tournoi[/g]
 
...
alphonse      250        T1
...
josianne      75         T2
...
josianne      854        T1
...
alphonse      50         T2
...


 
 
 
un joueur a participé à plusieurs tournois.
 
On veut les tournois où josianne à eu plus de points qu'alphonse.
 
 
solution 1:
 
select * from table "t" where joueur='josianne' and points > (select points from table where joueur='alphonse' and tournoi=t.tournoi);
 
 
 
solution 2:
 
select * from table "t", table where t.joueur='josianne' and joueur='alphonse' and t.tournoi=tournoi and t.points > points;
 
 
autre solution ?
 
 
 
quelle est la best solution ?
 
en fait, je me dis que pour la jointure il fait un produit cartésien avant et du coup ca me semble tres lourd.
Mais bon je connais pas bien et y a surement des subtilités qui doivent m'échapper, du genre qu'il ferait peut etre le produit cartésien seulement après avoir isolé les lignes 'josianne' et les lignes 'alphonse'.
 
enfin j'en sais rien c'est pour ca que je demande :p  
 
 
 
en fait, plus généralement, je voudrais savoir s'il vaut mieux faire l'un ou l'autre, ou s'il y a des cas plus favorables pour une solution ou l'autre.
 
 
merci
 
 
 
je suis neuneu ! n'est-ce pas ?


---------------
oui oui
Reply

Marsh Posté le 01-07-2003 à 23:40:07   

Reply

Marsh Posté le 01-07-2003 à 23:51:04    

art_dupond a écrit :


solution 1:
 
select * from table "t" where joueur='josianne' and points > (select points from table where joueur='alphonse' and tournoi=t.tournoi);
 
 
 
solution 2:
 
select * from table "t", table where t.joueur='josianne' and joueur='alphonse' and t.tournoi=tournoi and t.points > points;
 


solution 2.
Règle générale : si t'as une BDD douteuse (au hasard MySQL) prends systématiquement le 2. Sinon, prends le plus lisible, l'optimiseur fera la tranformation qu'il voudra (inlining et beta-reduction pour passer de 2 à 1 par ex.) si c'est pas optimal.
 
et fait gaffe à pas oublier les index sur les colones que tu joins.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 01-07-2003 à 23:57:38    

ok,  
 
 
donc sous oracle par exemple les deux seront kif si j'ai bien compris...


---------------
oui oui
Reply

Marsh Posté le 02-07-2003 à 15:25:48    

Euh... L'optimiseur est bien, mais faut pas pousser non plus, la première solution, je vois ça dans du code, je quite l'éditeur et je del le fichier, ça sera plus rapide de repartir de rien que d'un code aussi propre que des chiottes publiques.
 
Sous Oralce
 
Exemple :
 


select count(*) from tie
 
48649 lignes
 
 
select * from tie
where codsoc = 0
and typtie = 'CLI'
and posfis = 'A'
 
78 ms
 
 
select * from tie
where codsoc = 0
and typtie = 'REP'
and famtie = 'REP'
and posfis = 'A'
and codzn4 = 'FR'
 
328 ms
 
 
select * from tie
where codsoc = 0
and typtie = 'CLI'
and posfis = 'A'
and sigrep in (select sigtie from tie
         where codsoc = 0
      and typtie = 'REP'
      and famtie = 'REP'
      and posfis = 'A'
      and codzn4 = 'FR')
 
774 ms
 
 
select t1.* from tie t1, tie t2
where t2.codsoc = 0
and t2.typtie = 'REP'
and t2.famtie = 'REP'
and t2.posfis = 'A'
and t2.codzn4 = 'FR'
and t1.codsoc = 0
and t1.typtie = 'CLI'
and t1.posfis = 'A'
and t1.sigrep = t2.sigtie
 
94 ms


 
=> La jointure est plus rapide que chacune des deux requête à la suite. Alors je te parle même pas de la solution batarde de sous-requête...


Message édité par MagicBuzz le 02-07-2003 à 15:26:52
Reply

Sujets relatifs:

Leave a Replay

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