La Clé Primaire De Tri
Est une table intrinsèquement triés par sa clé primaire? Si j'ai une table dont la clé primaire sur un BigInt colonne d'identité puis-je faire confiance que les requêtes de toujours renvoyer les données triées par la clé ou puis-je expressément besoin d'ajouter le "ORDER BY". La différence de performance est importante.
- Double Possible de T", Sélectionnez " toujours commande par clé primaire?
Vous devez vous connecter pour publier un commentaire.
Les données sont stockées physiquement par index cluster, qui est généralement la clé primaire, mais n'a pas à être.
De données dans SQL n'est pas garanti d'avoir de l'ordre, sans une clause ORDER BY. Vous devez toujours spécifier une clause ORDER BY lorsque vous avez besoin que les données soient dans un ordre particulier. Si le tableau est déjà trié de cette façon, l'optimiseur ne pourra pas faire du travail supplémentaire, donc il n'y a pas de mal à avoir là.
Sans une clause ORDER BY, le SGBD peut retourner les pages mises en cache qui correspondent à votre requête pendant qu'il attend pour des enregistrements à lire à partir du disque. Dans ce cas, même si il y a un index sur la table, les données ne sont pas dans l'index de l'ordre. (Notez que ce n'est qu'un exemple - je ne sais pas ou même de penser qu'un monde réel SGBDR va le faire, mais c'est un comportement acceptable pour un SQL de mise en œuvre.)
MODIFIER
Si vous avez un impact sur les performances lors du tri par rapport à quand pas de tri, vous êtes probablement le tri sur une colonne (ou un ensemble de colonnes) qui n'ont pas un indice (cluster ou autre). Étant donné que c'est une série de temps, vous pourriez être de tri basé sur le temps, mais l'index cluster est sur le primaire de type bigint. SQL Server ne sais pas qui à la fois augmentation de la même manière, il a recours tout.
Si l'heure de la colonne et la colonne de clé primaire sont liés par l'ordre (on augmente si et seulement si l'autre augmente ou reste le même), trier par, la clé primaire de la place. Si elles ne sont pas liées de cette manière, déplacez l'index cluster à partir de la clé primaire à ce que la colonne(s) que vous êtes le tri par.
Sans un ORDRE explicite PAR, il n'y a pas d'ordre de tri par défaut. Une question très fréquente. En tant que tel, il est une conserve réponse:
Sans ORDER BY, il n'y a pas d'ordre de tri par défaut.
Pouvez-vous expliquer pourquoi "La différence de performance est importante."?
Une table par défaut n'est pas 'cluster' , c'est à dire organisé par PK. Vous avez également la possibilité de spécifier en tant que tel. Donc la valeur par défaut est "TAS" (dans aucun ordre particulier), et l'option que vous cherchez est "CLUSTER" (SQL Server, Oracle de son nom IOT).
Le plus tôt affiche est correct, SQL (et la base théorique de celle-ci) qui définit une sélection comme un non-ordonnée set/n-uplet.
SQL essaie de rester dans la logique royaume et de ne pas faire des hypothèses sur l'organisation physique /locations etc. des données. Le CLUSTER option nous permet de faire cela pour des raisons pratiques de situations de la vie réelle.
Vous devez appliquer le
ORDER BY
pour garantir une commande. Si vous remarquez une différence de performance qu'il est probable que vos données n'a pas été trié sansORDER BY
en place — sinon, SQL-Server doit être mal se comporter comme il n'est pas en réalisant les données sont déjà triées. L'ajout de laORDER BY
déjà trié les données ne devrait pas encourir une pénalité de performances depuis le SGBD doit être assez intelligent pour réaliser l'ordre des données.Dans SQL Server: non, c'est clé de cluster - dont la valeur par défaut de la clé primaire, mais ne doit pas être la même.
La clé primaire de la fonction principale est d'identifier de manière unique chaque ligne de la table - mais cela ne signifie pas tout (physique) de tri en soi.
Ne savez pas sur les autres systèmes de base de données.
Marc
Cela peut être mise en œuvre spécifiques, mais MySQL semble trier par la clé primaire par défaut. Cependant, à tout moment où vous avez besoin d'une garantie que les lignes seront commandés d'une certaine manière, vous devez ajouter la COMMANDE PAR.
Presque chaque fois qu'il va trier par les tables de l'Identité. Elle ne sorte par l'index cluster comme et ne peut pas toujours être triés par l'identité, mais je ne l'ai jamais vu non triées par l'identité id lors de la sélection *. Quelle est la raison derrière de ne pas spécifier une commande par? Je ne vois pas pourquoi cela entraîne une différence dans la performance.