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 ne sont pas explicitement ordonnées. Cela se traduit par une apparence différente lorsque les lignes sont extraites pour l'application Web et modifie le contenu d'une TOP 1
requête.
Je sais que je peux order by
les faire, 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 entraînent un ordre de premier entré, premier sorti, par exemple la dernière insertion est en bas, donc les identifiants sont tous dans une rangée. Y a-t-il un paramètre sur le serveur ou Management Studio qui provoque ce mauvais ordre?
la source
Réponses:
Dans le monde SQL, l'ordre n'est pas une propriété inhérente d'un ensemble de données. Ainsi, vous n'obtenez aucune garantie de votre SGBDR que vos données reviendront dans un certain ordre - ou même dans un ordre cohérent - sauf si vous interrogez vos données avec une
ORDER BY
clause.De Craig Freedman :
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 façon dont votre base de données peut stocker les lignes sur le disque (par exemple via un index clusterisé) pour garantir un certain ordre des données dans vos requêtes.la source
Juste pour augmenter les autres réponses: un tableau est, par définition, un ensemble de lignes non ordonné. Si vous ne spécifiez pas de
ORDER BY
clause, SQL Server est libre de renvoyer les lignes dans l'ordre qu'il juge le plus efficace. Cela arrive souvent juste pour coïncider avec l'ordre d'insertion, car la plupart des tables ont un index clusterisé sur l'identité, datetime ou d'autres colonnes à augmentation monotone, mais vous devez le traiter exactement comme ça: une coïncidence. Il peut changer avec de nouvelles données, une mise à jour des statistiques, un indicateur de trace, des modifications de maxdop, des conseils de requête, des modifications de la jointure ou des clauses where dans la requête, des modifications de l'optimiseur en raison d'un service pack / mise à jour cumulative / correctif / mise à niveau, déplacer la base de données vers un autre serveur, etc. etc.En d'autres termes, et je sais que vous connaissez déjà la réponse, mais on ne peut pas le dire assez:
la source
select
déclarationsC'est parce que la table est une table de tas (très probablement) et n'est pas indexée. Faites la colonne ID a
PRIMARY KEY
ainsi queIDENTITY
. SQL Server stocke physiquement les données en fonction des index - par exemple, si id était un index clusterisé (tel qu'une clé primaire), les données seraient physiquement stockées dans l'ordre des identifiants et seraient retournées de cette façon dans une requête même sans uneORDER BY
clause. Sinon, l'ordre des lignes n'est pas du tout important pour la base de données. Par conséquent, avoir une application dépend de l'ordre des lignes dans la base de données (ainsi que dépendre des colonnes se trouvant dans un certain ordre) n'est pas une bonne pratique. L'application doit fonctionner avec toutes les clés présentes dans la base de données pour identifier les lignes.la source
order by
(c'est une application héritée avec beaucoup de mauvaises pratiques) mais je me demandais exactement pourquoi cela s'est produit.SELECT *
sansORDER BY
puisse revenir dans le "bon" ordre (mais toujours pas garanti)?ORDER BY
clause est une bien meilleure garantie (même beaucoup moins perturbatrice) que d'apporter des modifications de schéma à la table et d' espérer que l'ordre sera comme vous l'attendez, pour toujours.