Pourquoi SSMS insère-t-il de nouvelles lignes en haut d'une table et pas en bas?


9

Chaque fois que j'insère manuellement une ligne dans une table dans SQL Server Management Studio 2008 (la base de données est SQL Server 2005), ma nouvelle ligne apparaît en haut de la liste plutôt qu'en bas.J'utilise des colonnes d'identité et cela se traduit par des choses comme

id row
42 first row
1 second row
2 third row

Lorsque les lignes sont extraites et non explicitement commandées.Cela se traduit par une apparence différente lorsque les lignes sont extraites pour l'application Web et modifie ce que la requête TOP 1 renvoie.

Je sais que je peux les order by , mais pourquoi cela se produit-il?La plupart de mes données sont insérées via une application Web. Toutes les insertions de cette application résultent en un ordre Premier entré, premier sorti.Existe-t-il des paramètres sur le serveur ou dans Management Studio qui entraînent cette commande incorrecte?

  0

Comme je l'ai vu parfois, cela dépend de l'ordre dans lequel les PK s'affichent, si vous sélectionnez une seule table.Si vous faites des jointures, cela peut changer en fonction des autres tables PK, FK et index ... 18 juil.. 132013-07-18 22:00:36

  0

Tenez compte des analyses [de manège] (http://technet.microsoft.com/en-us/library/ms191475%28v=sql.105%29.aspx) également. 01 avril. 152015-04-01 03:49:03

17

Dans le monde SQL, l'ordre n'est pas une propriété inhérente d'un ensemble de données.Ainsi, votre SGBDR ne vous garantit pas que vos données vont revenir dans un certain ordre, ni même dans un ordre cohérent, à moins que vous ne les interrogiez avec une clause ORDER BY .

De Craig Freedman :

La combinaison de TOP avec ORDER BY ajoute un déterminisme à l'ensemble des lignes renvoyées.Sans ORDER BY, l'ensemble des lignes renvoyées dépend du plan de requête et peut même varier d'une exécution à l'autre.

Utilisez toujours ORDER BY si vous attendez un ordre bien défini et cohérent dans votre jeu de résultats.Ne vous fiez jamais à la manière dont votre base de données peut stocker les lignes sur le disque (par exemple via un index clusterisé) pour garantir un certain classement des données dans vos requêtes.


0

C'est parce que la table est une table de tas (le plus probable) et n'est pas indexée.Faites de la colonne ID un PRIMARY KEY ainsi que IDENTITY .SQL Server stocke physiquement les données en fonction des index. Par exemple, si id est un index clusterisé (tel qu'une clé primaire), les données sont stockées physiquement dans l'ordre des identifiants et sont renvoyées de cette manière dans une requête une clause ORDER BY .Sinon, l'ordre des lignes n'a aucune importance pour la base de données.Par conséquent, le fait d'avoir une application dépend de l'ordre des lignes dans la base de données (ainsi que du fait que les colonnes sont dans un certain ordre) n'est pas une bonne pratique.L'application doit utiliser les clés de la base de données pour identifier les lignes.

  0

Bon à savoir.Je savais que c’était un conseil pour changer l’application afin qu’elle utilise 'order by' (c’est une application héritée avec beaucoup de mauvaises pratiques), mais je me demandais exactement pourquoi cela s’était passé. 14 sept.. 112011-09-14 19:49:38

+4

Changer la structure de la table juste pour que 'SELECT *' sans 'ORDER BY' *** puisse revenir *** dans le "bon" ordre (sans pour autant être garanti) 14 sept.. 112011-09-14 20:22:26

  0

Sur un simple SELECT de la table avec un index clusterisé reviendrait dans l'ordre de l'index clusterisé.N'était-ce pas aussi clair que j'aurais dû le faire? C’était une illustration du fait que les données sont classées par une colonne physique, mais il n’est certainement pas évident que dans chaque requête, elles seraient renvoyées correctement.Mea culpa. 14 sept.. 112011-09-14 20:27:39

+4

L'index clusterisé n'a pas vraiment d'importance.SQL Server peut toujours renvoyer la commande en fonction d'un autre index basé sur une grande variété de facteurs.Créer une clé primaire sur une colonne *** NE FAIT PAS *** garantit que les sélections sans ordre reviendront brusquement ordonnées par cette colonne toujours.Pourriez-vous observer cela la plupart du temps?Sûr.Mais ce n'est pas la même chose qu'une garantie.Je n'ai jamais vu d'ours polaire dans ma rue, mais il n'y a pas de champ de force d'ours polaire qui l'empêche de se produire. 14 sept.. 112011-09-14 20:41:09

+3

Quoi qu'il en soit, mon argument était que l'ajout d'une clause 'ORDER BY' est une bien meilleure garantie (sans parler de beaucoup moins perturbant) que d'apporter des modifications de schéma à la table et d '* espérer * que l'ordre sera comme vous le souhaitez, pour toujours. 14 sept.. 112011-09-14 20:42:25


10

Juste pour compléter les autres réponses: une table est, par définition, un ensemble non ordonné de lignes.Si vous ne spécifiez pas de clause ORDER BY , SQL Server est libre de renvoyer les lignes dans l'ordre qu'il juge le plus efficace.Cela arrivera souvent juste pour coïncider avec l'ordre d'insertion, car la plupart des tables ont un index clusterisé sur identity, datetime ou d'autres colonnes à croissance monotone, mais vous devez le traiter exactement comme cela: une coïncidence.Il peut changer avec de nouvelles données, une mise à jour de statistiques, un indicateur de trace, des modifications apportées à maxdop, des astuces de requête, des modifications de jointure ou des clauses where de la requête, des modifications apportées à l'optimiseur en raison d'une mise à jour cumulative/correctif/correctif, déplacer la base de données sur un autre serveur, etc.

En d'autres termes, et je sais que vous connaissez déjà la réponse, mais on ne peut pas le dire assez:

Si vous voulez vous fier à l'ordre d'une requête, ajoutez TOUJOURSORDER BY .

  0

Je n'avais pas prévu de dépendre de la commande, mais visuellement, il est un peu gênant que mes derniers articles insérés soient soudain au sommet. 14 sept.. 112011-09-14 20:18:15

  0

Je suppose que c'est parce que vous utilisez Open Table.Dans Management Studio 2008, cette commande a été divisée en "Éditer les n premières lignes" et "Sélectionner les N premières lignes". Lorsque vous choisissez cette dernière, vous êtes libre d'éditer la requête résultante, par exemple, en supprimant la première et en ajoutant une commande. 14 sept.. 112011-09-14 20:21:07

  0

C'est Management Studio 2008, le serveur est 2005, aurait dû être plus clair.Je ne savais pas qu'il y avait une commande "open table", j'ai toujours utilisé les instructions 'select' 14 sept.. 112011-09-14 20:36:30

+4

Ok, le problème persiste, je comprends que ce soit ennuyeux que les données soient renvoyées dans un ordre auquel vous ne vous attendez pas, mais j'espère que vous comprenez maintenant pourquoi SQL Server ne se soucie pas vraiment de l'ordre auquel vous vous attendez * à moins que vous ne lui indiquiez vous vous souciez en ajoutant une commande par clause.:-) 14 sept.. 112011-09-14 20:37:35