L'ordre D'une instruction SQL Select sans ordre Par clause

Que je sache, à partir de la base de données relationnelle théorie, un select sans order by la clause doit être considérée n'a pas d'ordre particulier. Mais en fait dans SQL Server et Oracle (j'ai testé sur ces 2 plates-formes), si je demande à partir d'une table sans un order by clause plusieurs fois, j'obtiens toujours les résultats dans le même ordre. Ce comportement ne peut être invoqué? N'importe qui peut aider à expliquer un peu?

29
demandé sur Luke Girvin 2012-04-08 20:48:08

4 réponses

non, on ne peut pas se fier à ce comportement. L'ordre est déterminé par la façon dont le planificateur de requête a décidé de construire le jeu de résultats. les requêtes simples comme select * from foo_table sont susceptibles d'être retournés dans l'ordre où ils sont stockés sur le disque, qui peut être dans l'ordre de la clé primaire ou l'ordre où ils ont été créés, ou un autre ordre aléatoire. des requêtes plus complexes, tels que select * from foo where bar < 10 peut être retourné dans l'ordre d'une colonne différente, basée sur un index lu, ou par l'ordre d'une table, pour un scan de table. même des requêtes plus élaborées, avec multipe where conditions,group by clauses,union s, sera dans n'importe quel ordre que le planificateur décide est le plus efficace pour générer.

L'ordre pourrait même changer entre deux requêtes identiques simplement à cause de données qui ont changé entre ces requêtes. une clause "où" peut être satisfaite avec un scan d'index dans une requête, mais des inserts ultérieurs pourraient rendre cette condition moins sélective, et le planificateur pourrait décider d'effectuer une requête subséquente en utilisant un analyse de la table.


Pour mettre une fine pointe. Les systèmes de SGBDR ont le mandat de vous donner exactement ce que vous avez demandé, le plus efficacement possible. Cette efficacité peut prendre de nombreuses formes, y compris la minimisation IO (à la fois sur le disque ainsi que sur le réseau pour vous envoyer des données), la minimisation CPU et le maintien de la taille de son ensemble de travail petite (en utilisant des méthodes qui exigent un stockage temporaire minimal).

sans ORDER BY l'article, vous aurez pas demandé exactement pour un ordre particulier, et donc le RDBMS vous donnera ces lignes dans un ordre qui (peut-être) correspond à un aspect coïncident de la requête, basé sur n'importe quel algorithme que le RDBMS s'attend à produire les données le plus rapide.

Si vous vous souciez de l'efficacité, mais pas de commande, passez à l' ORDER BY l'article. Si vous vous souciez de l'ordre, mais pas d'efficacité, utilisez le ORDER BY l'article.

Puisque vous se soucient réellement utilisez ORDER BY et puis ajustez soigneusement votre requête et la base de données afin qu'elle soit efficace.

34
répondu SingleNegationElimination 2017-07-19 14:08:09

Non, vous ne pouvez pas compter sur l'obtention de résultats dans le même ordre à chaque fois. j'ai découvert cela en travaillant sur une page web avec une grille de pagination. Quand je suis allé à la page suivante, puis retour à la page précédente, la page précédente contenait des enregistrements différents! J'étais complètement mystifié.

Pour des résultats prévisibles, alors, vous devez inclure un ORDER BY. même alors, s'il y a des valeurs identiques dans les colonnes spécifiées, vous pouvez obtenir différentes résultat. Vous pourriez avoir à ORDER BY des champs dont vous ne pensiez pas avoir besoin, juste pour obtenir un résultat prévisible.

5
répondu DOK 2012-04-08 16:56:18

Tom Kyte a un bête noire sur ce sujet. Pour quelque raison que ce soit, les gens sont fascinés par cela, et continuent d'essayer de trouver des cas où vous pouvez vous fier à un ordre spécifique sans spécifier L'ordre par. Comme d'autres l'ont dit, vous ne pouvez pas. Ici un autre amusant thread

3
répondu DCookie 2012-04-08 17:25:46

La Bonne Réponse

C'est une nouvelle réponse ajoutée pour corriger l'ancien. J'ai la réponse de Tom Kyte et je la poste ici:

si vous voulez trier les lignes, vous devez utiliser une commande. Non si, et, ou mais à propos de ça. période. http://tkyte.blogspot.ru/2005/08/order-in-court.html Vous avez besoin d'ordre sur ce IOT. Les rangées sont triées en blocs de feuilles, mais les blocs de feuilles ne sont pas stockés triés. balayage complet rapide=non trié rangée.

https://twitter.com/oracleasktom/status/625318150590980097

https://twitter.com/oracleasktom/status/625316875338149888


La Mauvaise Réponse

( Attention! la réponse originale à la question a été placée ici seulement pour l'histoire. C'est pas la bonne réponse. La bonne réponse est placé au-dessus)

comme L'a écrit Tom Kyte dans l'article mentionné avant:

vous devriez penser à une table organisée en tas comme une grande table sans ordre collection de rangées. Ces rangées sortiront dans un apparemment aléatoire ordre, et en fonction des autres options utilisées (requête parallèle, différents modes d'optimiseur et ainsi de suite), ils peuvent sortir dans un commande avec la même requête. Ne jamais compter sur l'ordre des lignes de une requête à moins que vous n'ayez une commande par déclaration sur votre requête!

mais notez qu'il ne parle que de tables organisées en tas. Mais il y a aussi l'indice-orgainzed tables. Dans ce cas, vous pouvez compter sur l'ordre de la sélectionner sans ORDER BY parce que commande implicitement défini par la clé primaire. C'est vrai pour Oracle.

Pour SQL Server en cluster index (index organisé des tables) créé par défaut. Il est également possible D'aligner les informations PostgreSQL par index. Plus d'informations peuvent être trouvées ici

mise à jour: Je vois qu'il y a un vote négatif sur ma réponse. Je voudrais donc essayer d'expliquer mon point de vue un peu. Dans la section vue d'ensemble de l'Indice de la a Organisé des Tables il y a une phrase:

dans une table indexée, les lignes sont stockées dans un index défini sur la touche primaire de la table... Les tables organisées par Index sont utiles lorsque des données connexes doivent être stockées ensemble ou lorsque les données doivent être stockées physiquement. dans un ordre spécifique.

http://docs.oracle.com/cd/E25054_01/server.1111/e25789/indexiot.htm#CBBJEBIH

à cause de l'index, toutes les données sont stockées dans un ordre précis, je crois qu'il en va de même pour Pg. http://www.postgresql.org/docs/9.2/static/sql-cluster.html

si vous n'êtes pas d'accord avec moi, veuillez me donner un lien sur la documentation. Je vais être heureux de savoir qu'il y a quelque chose à apprendre pour moi.

0
répondu Alexander Myshov 2016-05-22 23:30:38