9
votes

Pourquoi Oracle renvoie-t-elle une séquence spécifique si les valeurs «ordonnance» sont identiques?

Je suis déconcerté par une requête à Oracle qui retourne dans un ordre apparemment aléatoire.

   |  Date       |  Amount
--------------------------
1  |  26-OCT-10  |  85
2  |  26-OCT-10  |  9
3  |  26-OCT-10  |  100


0 commentaires

4 Réponses :


-1
votes

sons comme Oracle utilise un Stable Algorithme de tri pour faire le tri.


2 commentaires

Citation requise. Les documents Oracle n'affirment pas que les résultats sont définis lors du tri de deux valeurs identiques. télécharger.oracle.com/docs/cd/ E11882_01 / Server.112 / E17118 / ...


Jeffrey est correct: l'ordre peut sembler stable, mais en réalité, il est tout à fait possible pour la commande de changer - par exemple si un index est ajouté à la table.



12
votes

La commande n'est pas réduite à "Pure Chance" - sauf si vous modifiez la requête à:

SELECT
  Date,
  Amount
FROM MyTable
WHERE Date = '26-OCT-2010'
ORDER BY Date, DBMS_RANDOM.VALUE;


1 commentaires

Merci pour l'explication! Je pensais que cela peut simplement «revenir» à l'ordre rencontré, comme SQL Server, mais n'était pas si sûr. Merci encore!



2
votes

Bien que je ne connaisse rien sur la mise en œuvre d'Oracle, si toutes choses étant égales, dans Priory, ils ne seront pas dans un ordre aléatoire: les mettre dans un ordre aléatoire nécessiterait une randomisation de la commande à chaque fois, (qui serait n opérations randomissantes, où n est le nombre d'éléments (en utilisant la grosse notation, ce serait O (n)), ce qui est une chose calculée en calcul, si la requête reviendrait énormément (millions) de résultats.

retourné par la requête

Il n'est pas nécessaire qu'ils soient randomisés de cette manière.

Au lieu de cela, cela les renvoie simplement (ce que je devine, c'est) la commande qu'ils sont stockées sur disque


0 commentaires

2
votes

Lire Cette belle pièce du blog de Tom Kyte concernant la commande .

Lorsque vous dites que les lignes sont revenues dans la commande "1,3,2", vous devez commander par la ou les colonnes qui vous disent que c'est dans 1,3,2 afin de le réparer.


0 commentaires