Lorsque vous créez un index sur une colonne ou un nombre de colonnes dans MS SQL Server (j'utilise la version 2005), vous pouvez spécifier que l'index de chaque colonne soit croissant ou décroissant. J'ai du mal à comprendre pourquoi ce choix est encore là. En utilisant des techniques de tri binaire, une recherche ne serait-elle pas aussi rapide de toute façon? Quelle différence cela fait-il quelle commande je choisis?
sql
sql-server
optimization
indexing
Joshua Carmody
la source
la source
Réponses:
Ceci est principalement important lorsqu'il est utilisé avec des index composites:
peut être utilisé pour:
ou:
, mais pas pour:
Un index sur une seule colonne peut être utilisé efficacement pour le tri dans les deux sens.
Voir l'article de mon blog pour plus de détails:
Mettre à jour:
En fait, cela peut avoir de l'importance même pour un seul index de colonne, même si ce n'est pas si évident.
Imaginez un index sur une colonne d'une table en cluster:
L'index sur
col1
conserve les valeurs ordonnées decol1
avec les références aux lignes.Étant donné que la table est groupée, les références aux lignes sont en fait les valeurs du
pk
. Ils sont également classés dans chaque valeur decol1
.Cela signifie que les feuilles de l'index sont effectivement ordonnées sur
(col1, pk)
, et cette requête:n'a pas besoin de tri.
Si nous créons l'index comme suit:
, alors les valeurs de
col1
seront triées par ordre décroissant, mais les valeurs depk
dans chaque valeur decol1
seront triées par ordre croissant.Cela signifie que la requête suivante:
peut être servi
ix_mytable_col1_desc
mais pas parix_mytable_col1
.En d'autres termes, les colonnes qui constituent un
CLUSTERED INDEX
sur n'importe quelle table sont toujours les colonnes de fin de tout autre index de cette table.la source
Pour un véritable index à une seule colonne, cela fait peu de différence du point de vue de l'optimiseur de requêtes.
Pour la définition de la table
La requête
Utilise un scan ordonné avec la direction du scan
BACKWARD
comme indiqué dans le plan d'exécution. Il y a cependant une légère différence en ce que seuls lesFORWARD
scans peuvent actuellement être parallélisés.Cependant, cela peut faire une grande différence en termes de fragmentation logique . Si l'index est créé avec des clés décroissantes mais que de nouvelles lignes sont ajoutées avec des valeurs de clé ascendantes, vous pouvez vous retrouver avec chaque page dans le désordre logique. Cela peut avoir un impact important sur la taille des lectures d'E / S lors de l'analyse de la table et elle n'est pas dans le cache.
Voir les résultats de la fragmentation
pour le script ci-dessous
Il est possible d'utiliser l'onglet des résultats spatiaux pour vérifier la supposition que cela est dû au fait que les pages suivantes ont des valeurs de clé croissantes dans les deux cas.
la source
L'ordre de tri est important lorsque vous souhaitez récupérer de nombreuses données triées, et non des enregistrements individuels.
Notez que (comme vous le suggérez avec votre question), l'ordre de tri est généralement beaucoup moins significatif que les colonnes que vous indexez (le système peut lire l'index en sens inverse si l'ordre est opposé à ce qu'il veut). Je pense rarement à l'ordre de tri de l'index, alors que je m'inquiète des colonnes couvertes par l'index.
@Quassnoi fournit un excellent exemple de quand il n'importe.
la source