2009-03-16 12 views
19

Dans Sql Server, j'ai une table avec une clé primaire Identity. Souvent, je veux les derniers nouveaux enregistrements, donc je prends le Top n trié en descendant la clé primaire. Dois-je définir l'index de la clé primaire comme décroissant, ou cela ne fait-il aucune différence? c'est-à-dire que s'ils sont dans l'ordre ascendant, alors sq peut-il tout aussi bien travailler en arrière?Clé primaire Croissant et décroissant

+0

Non, vous ne devriez pas ** ** le créer comme 'desc'. Vous allez vous retrouver avec beaucoup de fragmentation logique des insertions [comme montré ici] (http://stackoverflow.com/a/9382500/73226) –

Répondre

30

D'un point de vue purement interrogation, il ne fait aucune différence si votre clé est descendante ou ascendante si vous voulez tirer N les plus récents ou N enregistrements les plus anciens:

Les algorithmes internes de SQL Server peut naviguer aussi efficacement dans les deux directions sur un index à une seule colonne, indépendamment de la séquence dans laquelle les clés sont stockées. Par exemple, si vous spécifiez DESC sur un index à colonne unique, les requêtes avec une clause ORDER BY IndexKeyCol DESC ne sont pas exécutées plus rapidement que si ASC a été spécifié pour l'index.

http://msdn.microsoft.com/en-us/library/aa933132(SQL.80).aspx

Cependant en toute circonstance à peu près normale, vous voulez que votre clé primaire à ascendante et ordinale séquentielle pour éviter la fragmentation. SQL Server est optimisé pour l'ajout physique de nouveaux enregistrements à la fin du fichier de base de données. Si elle doit insérer chaque nouvel enregistrement en haut et tout pousser vers le bas, il en résultera probablement une fragmentation de presque 100%.

3

Cela ne fait absolument aucune différence.

Je ne peux même pas imaginer pourquoi il est possible de le déclarer de toute façon.

+3

Avec un seul index de colonne, cela ne fait aucune différence, mais ASC et DESC entrent en jeu lorsque vous avez plusieurs colonnes dans l'index et que l'ordre est important pour la colonne second/troisième/quatrième/etc. –

+0

Cela n'a aucun sens pour moi. Si vous avez deux valeurs de champ, comment vous descendez l'arbre est complètement indifférent. Est-ce juste une supposition, ou avez-vous une référence? – dkretz

+0

Cela a du sens pour moi. Si vous avez un index déclaré 'A ASC, B DESC' mais la plupart de vos requêtes sont' ORDER BY A ASC, B ASC' qui n'évitera pas un tri. –