Quelle est l'importance de l'ordre des colonnes dans les index?
J'ai entendu dire que vous devriez mettre les colonnes qui seront le plus sélectif au début de l'indice de déclaration. Exemple:
CREATE NONCLUSTERED INDEX MyINDX on Table1
(
MostSelective,
SecondMost,
Least
)
Tout d'abord, est ce que je dis correct? Si oui, suis-je susceptible de voir de grandes différences dans la performance en réorganisant l'ordre des colonnes dans mon index, ou est-il plus "agréable" pratique?
La raison pour laquelle je suis demander c'est parce que après avoir mis une requête par le biais de la DTA, il a recommandé que je créer un index qui ont presque tous les mêmes colonnes en elle comme un index existant, juste dans un ordre différent. J'envisage simplement d'ajouter les colonnes manquantes à l'index existant et en l'appelant, il est bon. Pensées?
Vous devez vous connecter pour publier un commentaire.
Regarder un indice comme ceci:
Voir comment la restriction de sur les Une première, en tant que votre première colonne permet d'éviter plus de résultats que la restriction sur votre deuxième colonne de la première? C'est plus facile si vous imaginez ce que l'index doit être parcouru à travers, colonne 1, colonne 2, etc...vous voyez que tailler la plupart des résultats dans le poing pass rend la 2ème étape que beaucoup plus rapide.
Un autre cas, si vous interrogé sur la colonne 3, l'optimiseur ne serait même pas utiliser l'index, car il n'est pas utile tout en réduisant les jeux de résultats. Quand vous êtes dans une requête, réduisant le nombre de résultats à traiter avant la prochaine étape signifie de meilleures performances.
Depuis que l'indice est également stocké de cette façon, il n'y a pas de retour en arrière à travers l'index pour trouver la première colonne lorsque vous interrogez sur elle.
En bref: Non, ce n'est pas pour le spectacle, il y a de vrais avantages de performance.
L'ordre des colonnes est critique. Maintenant que l'ordre est correcte, il dépend de la façon dont vous allez l'interroger. Un index peut être utilisé pour faire un exact de rechercher ou d'une analyse de plage. Une exacte recherche est lorsque les valeurs pour toutes les colonnes de l'index est spécifié et que la requête s'arrête sur la ligne qui l'intéresse. Pour cherche l'ordre des colonnes n'est pas pertinent. Une analyse de plage, c'est quand seulement certaines colonnes sont spécifiées, et dans ce cas, lorsque l'ordre est important. SQL Server peut utiliser un index pour une analyse uniquement si la colonne la plus à gauche est spécifié, et seulement si, la prochaine colonne la plus à gauche est spécifié, et ainsi de suite. Si vous avez un index sur (A,B,C), il peut être utilisé pour l'analyse de plage pour les
A=@a
, pourA=@a AND B=@b
mais pas pourB=@b
, pourC=@c
niB=@b AND C=@c
. Le casA=@a AND C=@c
est un mixte, comme dans leA=@a
partie de l'index, mais leC=@c
pas (la requête va scanner toutes les valeurs de B pourA=@a
, ne sera pas "skip" pourC=@c
). D'autres systèmes de base de données ont appelé "skip scan" de l'opérateur qui peut prendre un certain avantage de l'intérieur des colonnes dans un index lorsque les colonnes extérieures ne sont pas spécifiés.Avec cette connaissance à la main, vous pouvez regarder la définition des indices de nouveau. Un index sur
(MostSelective, SecondMost, Least)
sera effective que lorsqueMostSelective
la colonne spécifiée. Mais étant donné que la plus sélective, la pertinence de l'intérieur des colonnes se dégradent rapidement. Très souvent, vous verrez que un meilleur indice est sur(MostSelective) include (SecondMost, Least)
ou sur(MostSelective, SecondMost) include (Least)
. Parce que l'intérieur des colonnes sont moins pertinentes, en plaçant une faible sélectivité des colonnes dans de telles positions dans l'index rend rien, mais le bruit pour une recherche, il est donc logique de les déplacer hors de l'intermédiaire de pages et de les garder uniquement sur les pages de feuilles, pour la requête coverability fins. En d'autres termes, les déplacer à INCLURE. Cela devient plus importante que la taille deLeast
colonne augmente. L'idée est que cet indice ne peut que bénéficier à des requêtes qui spécifientMostSelective
soit comme une valeur exacte ou une autre, et que la colonne la plus sélective, c'est déjà limite le candidat lignes à grande échelle.D'autre part un index sur
(Least, SecondMost, MostSelective)
peut sembler être une erreur, mais c'est en fait assez un puissant indice. Parce qu'il a laLeast
colonne comme ultrapériphériques de la requête, il peut être utilisé pour les requêtes qui ont pour agréger les résultats sur la faible sélectivité des colonnes. Ces requêtes sont courantes dans la OLAP et l'analyse des entrepôts de données, et c'est exactement là où de tels indices ont une très bonne affaire pour elle. Ces indices font réellement excellent cluster index, précisément parce qu'ils organisent la disposition physique sur de grandes portions de lignes connexes (mêmeLeast
valeur, ce qui indique généralement une sorte de catégorie ou un type) et qu'ils facilitent l'analyse des requêtes.Donc, malheureusement, il n'y a pas de "corriger" l'ordre. Vous ne devriez pas suivre tout à l'emporte-pièce recette mais au lieu d'analyser le modèle de requête, vous allez contre l'utilisation de ces tables et de décider de l'index de la colonne de la commande est de droit.
Que Remus dit que cela dépend de votre charge de travail.
Je voudrais aborder un aspect trompeur de la accepté de répondre si.
Pour les requêtes qui sont de l'exécution d'une égalité de recherche sur toutes les colonnes de l'index il n'y a pas de différence significative.
Ci-dessous crée deux tables et remplit avec des données identiques. La seule différence est que l'on a les clés ordonnées de la plus à la moins sélective et l'autre l'inverse.
En train de faire une requête sur deux tables...
... Deux d'entre eux utilisent un indice d'amende et deux sont donné exactement le même coût.
L'ASCII art dans l'acceptation réponse n'est pas, en fait, la façon dont les index sont structurés. Les pages d'index pour Table1 sont représentés ci-dessous (cliquez sur l'image pour l'ouvrir en taille réelle).
Les pages d'index contient des lignes contenant l'ensemble de la clé (dans ce cas, il est en fait une colonne clé supplémentaire ajouté pour l'identificateur de ligne, l'indice n'a pas été déclarée comme un être unique, mais qui peut être ignoré de plus amples informations à ce sujet peuvent être trouvés ici).
Pour la requête ci-dessus SQL Server ne se soucient pas de la sélectivité des colonnes. Il fait un binaire de recherche de la page racine et découvre que le Clé
(PPP...,3,~ )
est>=(JJJ...,1,~ )
et< (SSS...,3,~ )
donc, il faut lire la page1:118
. Il fait ensuite une recherche binaire des entrées de clé sur cette page et localise la page feuille pour faire le trajet à.Modifier l'index dans l'ordre de sélectivité n'a pas d'incidence sur le nombre de comparaisons clés de la recherche binaire ou le nombre de pages qui doivent être explorés pour faire une recherche d'index. Au mieux, il pourrait légèrement la vitesse de la comparaison clé elle-même.
Parfois, la commande la plus sélective de l'indice d'abord du sens, pour d'autres requêtes dans votre charge de travail même si.
E. g si la charge de travail contient les requêtes des deux formes suivantes.
L'index ci-dessus ne sont pas de couverture pour l'un ou l'autre.
MostSelective
est suffisamment sélectif pour faire un plan avec une recherche et des recherches de la peine, mais la requête contreLeast
ne l'est pas.Toutefois ce scénario (non couvrant recherche d'index sous-ensemble de la colonne principale(s) d'un indice composite) est possible qu'une seule classe de requête qui peut être aidé par un index. Si vous n'avez jamais fait de recherche par
MostSelective
sur son propre ou une combinaison deMostSelective, SecondMost
et toujours à la recherche d'une combinaison de tous les trois colonnes, alors cet avantage théorique est inutile de vous.À l'inverse des requêtes telles que
Serait facilitée par la présence de l'ordre inverse du couramment prescrits - comme il se couvre de la requête, peut soutenir une recherche et renvoie les lignes dans l'ordre souhaité pour démarrer.
C'est donc souvent répété morceau de conseils, mais en plus c'est une heuristique sur les avantages potentiels pour autres requêtes - et il n'est pas un substitut pour en fait en regardant votre de la charge de travail.
Correcte.
Les index peuvent être composites -, composée de plusieurs colonnes et l'ordre est important en raison de l'extrême gauche le principe. La raison en est, que la base de données vérifie la liste de gauche à droite, et doit trouver un correspondant de la colonne de référence correspondant à l'ordre défini. Par exemple, ayant un index sur une table d'adresses avec des colonnes:
Toute requête à l'aide de la
address
colonne peut utiliser l'indice, mais si la requête ne soitcity
et/oustate
références - l'index ne peut pas être utilisé. C'est parce que la colonne la plus à gauche n'est pas référencé. Les performances de la requête devrait vous dire ce qui est optimal - des indices individuels, ou plusieurs composés avec des ordres différents. Bonne lecture: Le Point De Basculement, par Kimberley TrippToutes les réponses sont fausses.
Sélectivité des différentes colonnes dans un indice composite ne pas question lors de la prise de la commande.
Voici le simple processus de pensée: de manière Efficace, un indice est la concaténation des colonnes concernées.
Donner cette explication, la seule différence est de comparer deux chaînes de caractères qui diffèrent plus tôt lieu de plus tard dans la chaîne. Ce n'est qu'une infime partie du coût total. Il n'y a pas de "premier passage /seconde passe", comme mentionné dans une Réponse.
Donc, quel ordre doit-il être utilisé?
=
, dans tout commande.Par exemple, le très-faible sélectivité de la colonne doit venir en premier dans cette:
La permutation de l'ordre dans l'indice aurait-il totalement ignorer
deleted
.(Il y a beaucoup plus de règles pour la commande de colonnes.)
deleted
n'aide pas beaucoup pour filtrer les indésirables lignes. Avez-vous un meilleur exemple? (C'est celui qui surgit dans mon esprit quand j'ai écrit la Réponse.)