Un programmeur teste et compare la même application qui utilise la même structure de base de données et les mêmes données, uniquement dans deux bases de données distinctes, une avec Oracle 8 et une avec Oracle 9.
L'application exécute une requête sans ORDER BY
clause.
Il prétend que la requête ORDER-BY-less devrait renvoyer les lignes dans le même ordre dans les deux bases de données.
Je lui dis qu'il n'y a pas de garantie pour la même commande de ligne, sauf si vous fournissez explicitement une clause ORDER BY.
La base de données a les mêmes index et clés. Mais le plan d'explication montre que dans l'une des bases de données, le moteur utilise la clé de l'une des tables jointes tandis que dans l'autre base de données, il utilise une autre.
Il insinue que les deux environnements DB ne sont pas égaux, c'est parce qu'ils ont des statistiques différentes, des moteurs rdbms différents, etc., mais pas parce que je n'ai pas réussi à répliquer tous les index de la base de données d'origine.
Je lui dis qu'il doit explicitement prévoir une ORDER BY
clause si l'ordre est vraiment aussi important.
La question
Je peux donc mieux l'expliquer:
Dans quel ordre une requête récupère-t-elle les lignes lorsque vous ne fournissez pas explicitement une clause ORDER BY, et pourquoi cette requête ne renvoie-t-elle pas les lignes dans le même ordre?
Réponses:
De Wikipédia :
Ce n'est donc pas défini.
La spécification SQL n'indique pas l'ordre spécifique auquel les enregistrements doivent être retournés, donc cela dépendra de l'implémentation.
Sans index sur la table, l'ordre raisonnable serait l'ordre dans lequel les enregistrements ont été insérés. Avec une clé primaire définie, l'ordre sensible serait l'ordre de la clé primaire. Mais comme la spécification ANSI ne nécessite pas de commande spécifique, c'est au vendeur de décider, et leur sensibilité peut différer de la vôtre ou de la mienne.
Étant donné que la commande n'est pas indiquée dans la spécification, il n'est pas judicieux de s'appuyer sur le comportement de l'implémentation d'un fournisseur particulier, car elle peut varier d'un fournisseur à l'autre, et le fournisseur peut modifier la commande à tout moment, sans avertissement.
Comme vous l'avez dit, il suffit d'inclure la
ORDER BY
clause, si l'ordre est important.la source
Il est évident que la spécification ne dit pas dans quel ordre les données arrivent, n'a pas fonctionné. Probablement parce qu'il sait que les données se trouvent sur un disque ou en mémoire quelque part et ont donc cela comme ordre. Demandez-lui quel est l'ordre des données calculées à partir de plusieurs tableaux. C'est à dire créer un exemple où vous joignez 4 tables, en faisant un calcul sur 2 d'entre elles et en retournant juste la valeur calculée.
Le moteur renvoie les données dans l'ordre dans lequel il les trouve (en l'absence d'une commande par), mais la façon dont il les trouve dépend de facteurs qui peuvent changer - index, statistiques, caches. Généralement, les données seront dans un ordre cohérent - mais si vous dépendez de la commande, vous devez la demander.
la source