|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() SQLI Inscription : novembre 2011 Messages : 42 ![]() |
Bonjour tout le monde,
J’ai cette requête : Code :
PS : Dans mon exemple, et vu que j’ai pas de doublon, la requête sans/avec DISTINCT est censée renvoyer le même résultat mais c’est pas le cas. Avous-vous une idée le DISTINCT fait quoi à part l’élimination des doublons ? d’autres Order by peut être ? Où alors avez-vous une idée sur l'algorithme de "DISTINCT" ? Merci |
||
|
|
00
|
|
|
#2 | |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Citation:
Donc oui, avec un DISTINCT il y a des opérations en plus, ce qui peut changer l'ordre. |
|
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() SQLI Inscription : novembre 2011 Messages : 42 ![]() |
Justement, mon abjectif c'est que de savoir la logique de DISTINCT qui fait bouger le tri.
|
|
|
01
|
|
|
#4 |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Mais ... il n'y a pas de tri possible entre des valeurs identiques !
Donc la logique, c'est qu'il met les lignes dans l'ordre où elles lui arrivent. Et forcément, si on lui demande de faire des opérations en plus, elles peuvent ne pas arriver dans le même ordre. Si par contre vous lui demandez order by champs1, le DISTINCT garantissant l'unicité, il y aura un ordre unique, et ce sera alors déterministe. |
|
|
00
|
|
|
#5 | |||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Citation:
Code :
|
|||
|
|
10
|
|
|
#6 |
|
Invité régulier
![]() SQLI Inscription : novembre 2011 Messages : 42 ![]() |
C'est clair.
Ce que j'ai voulu savoir en fait, et je pense que c'est pas possible, c'est pourquoi si je rajoute "DISTINCT" dans la meme requete, ça me renvoie exactement le meme resultat mais avec un tri différent. Merci |
|
|
00
|
|
|
#7 | |||
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Citation:
Par exemple : Code :
Un distinct me sort 1,2,3. Si j'enlève le order by, j'ai l'ordre naturel de lecture 3,1,2. Enfin le distinct sans le order by me donne 3,2,1. Bien sûr, si je faisais un "vrai" tri, utile, sur la colonne a, j'aurais toujours le même ordre 1,2,3. |
|||
|
|
10
|
|
|
#8 |
|
Invité régulier
![]() SQLI Inscription : novembre 2011 Messages : 42 ![]() |
Très bien! C'est clair
Merci |
|
|
00
|
|
|
#9 | ||||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Citation:
Code :
Citation:
|
||||
|
|
21
|
|
|
#10 | ||
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Citation:
Je ne conteste pas que le tri arrive en dernier. Je dis juste - si vous me relisez - que si le tri ne peut pas distinguer les objets, l'ordre n'est plus garanti et donc dépend forcément de ce qui s'est passé avant. Citation:
|
||
|
|
02
|
|
|
#11 | |
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 306 ![]() |
Citation:
Pourquoi se baser sur des choses qu'on sait fausses alors que c'est tellement plus simple et vrai d'ajouter un order by? D'autant plus que ca ne fonctionne (peut-etre) que pour votre select from dual. A partir du moment ou vous avez une table avec des delete et insert, c'est dans le desordre. C'est juste a proscrire comme solution Enfin chacun est libre de faire ce qu'il veut |
|
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Je ne me base sur rien, je dis même explicitement le contraire. Relisez le thread, j'explique juste à quelqu'un pourquoi quand il met distinct, l'ordre de retour change alors qu'il a un order by.
|
|
|
10
|
|
|
#13 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Citation:
Avant Oracle 10 le group by faisait aussi le tri. Quand Oracle a changé l'algorithme de regroupement toutes les requêtes sans order by ont deconnées! |
|
|
|
11
|
|
|
#14 | ||
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 306 ![]() |
@mnitu: Ca sert a rien de lui faire dire ce qu'il n'a pas dit. (J'avais pas compris non plus)
Ce qu'il dit, c'est que dans : Code :
L'ordre des lignes avec N, lui il depend du bon vouloir de la BdD vu qu'il n'y a pas de order by sur cette colonne. Et en l'occurence si on fait un traitement sur N, cet ordre (qui n'est pas un tri) peut changer. |
||
|
|
11
|
|
|
#15 | |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Précisément, je parle bien d'un tri effectué par un order by. J'ai la nette impression que vous ne me lisez pas !
Citation:
Cependant, l'ordre est dans la grande majorité des cas déterministes tant qu'on n'a rien changé sur les tables (déterministe ne veux pas dire prévisible a priori), et que le plan d'exécution est le même. En changeant le plan d'exécution, par exemple en rajoutant un distinct, on a donc toutes les chances de changer l'ordre d'arrivée des résultats équivalents du point de vue de l'order by. Et c'était précisément la question de départ du thread. |
|
|
|
00
|
|
|
#16 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Citation:
Dans un panier vous avez 3 bille rouge numérotés 1, 2, 3. Et vous voulez sortir toutes les billes du panier, une par une, par ordre de couleur. Et ensuite vous constatez qu’entre deux essaie consécutives l’ordre des numéros des billes n’est pas la même !? Fait le tri donc aussi sur les numéros des billes et arrêtez de parler d’ « ordre naturel », déterminisme et prévisibilité ! Et si les billes ne sont pas numérotées et donc strictement identique vous ne pouvez plus même parler d’ordre!
|
|
|
|
00
|
|
|
#17 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
|
|
|
11
|
|
|
#18 | ||
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Citation:
Vous noterez cependant que Oracle sort les éléments équivalents dans un certain ordre (au sens, ordre du curseur de sortie) qui, s'il n'est pas prévisible a priori, reste déterministe parce que déterminé par la façon dont il a récupéré ces valeurs. Encore une fois : faites l'essai des requêtes simplistes que je donne et constatez l'ordre d'affichage. Citation:
Quant à l'ordre "naturel", je l'ai indiqué pour le cas basique où je demande à Oracle des select from dual avec des union all, sans order by et sans clause where. Jusqu'à ce jour, il m'a toujours ressorti les valeurs dans l'ordre où je lui avais donné, c'est ce que j'ai appelé "naturel". Cela dit, on tourne en rond, ce qui fait que je m'arrêterai là dans l'auto-justification. |
||
|
|
11
|
|
|
#19 |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
|
|
|
11
|
|
|
#20 |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Salut,
Je pense que ce que veut dire Mnitu, c'est qu'il est dangereux de parler d'ordre en dehors de l'ORDER BY, parce que ce n'est pas déterministe. Le plan par exemple, peut changer sans changer la requête (paramètres de l'optimiseur, du système, volmétries et répartition des données, ...). Et je pense que même avec un plan strictement équivalent, ton séquencement en sorti peut changer (peut être des reorg, rebuilds ?) Donc, si la question posée ici relève de la pure curiosité pour le fonctionnement Oracle, OK. Par contre, si cela impacte le traitement des données, il ne faut pas se poser la question dans ce sens et : - Soit ajouter des critères pour le tri - Soit modifier le programmes pour qu'il ne soit pas affecté par le séquencement en sortie.
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
10
|
Copyright © 2000-2012 - www.developpez.com