web-dev-qa-db-fra.com

Y a-t-il une différence avec la spécification de la clé principale comme une colonne Inclure dans un indice non clustered?

N'indiquez pas de manière intrinsèquement une référence à la clé primaire sur une table de sorte qu'il puisse effectuer une recherche clé si nécessaire? ... Si tel est le cas, est-il moins ou plus performant de spécifier la clé primaire comme une colonne incluse lorsque créer un index non clustered?

Question latérale, pourquoi l'index non clusteré par défaut de stocker la clé primaire et non les champs d'index en cluster pour effectuer une recherche clé sur la table? ... Dans les cas où la clé principale n'est pas l'index en cluster, n'est-ce pas plus lent. Pour que la recherche clé se produise, tandis que si elle stockait l'index en cluster, cela pourrait faire la recherche de cette façon?

5
J.D.

Les index non clusters contiennent un localisateur de rangée à la table de base.

Ceci est une clé d'index en cluster pour les tables de RowStore avec un index en cluster ou un débarras physique (fichier/page/emplacement) pour les tas.

Donc, les parties de votre question supposant que cela utilise la clé primaire (dans le cas où elles sont différentes) sont discutées.

Le localisateur de lignes est ajouté à la touche des index non clusters uniques et comme une colonne incluse aux index non clusters déclarés comme uniques.

Il n'y a pas d'avantage de performance de la spécifier explicitement pour le cas included. Dans le cas où il est implicitement ajouté à la clé, vous devrez peut-être procéder explicitement si vos requêtes bénéficieraient d'une autre asc/desc direction ou de commande multiple que l'implicitement vous donnerait .

Vous préférerez peut-être être explicite à ce sujet pour être lisibilité de votre code pour les développeurs inconnus avec le comportement implicite ou si vos requêtes auraient toujours besoin de ces colonnes de l'indice, même si la définition d'index en cluster devait changer à l'avenir.

Concernant la question suivante dans les commentaires

Cela signifie-t-il qu'il est possible d'effectuer une recherche clé à partir d'un index non clusterné pour la clé primaire (lorsque la clé principale n'est pas l'index en cluster)) si cette clé principale est dans la liste Sélectionner?

Oui, vous pouvez voir cela avec ci-dessous.

CREATE TABLE #T
(
PK INT PRIMARY KEY NONCLUSTERED,
CI INT INDEX CIX CLUSTERED,
OtherCol INT INDEX NCIX NONCLUSTERED
)

SELECT *
FROM #T WITH (FORCESEEK)
WHERE OtherCol = 10

enter image description here

  1. La liste de sortie de la recherche sur NCIX est Uniq1001, CI, OtherCol
  2. Les valeurs de CI, Uniq1001 sont ensuite utilisés par la recherche pour rechercher dans l'index en cluster ...
  3. ... et la valeur de PK est renvoyée de cette recherche.

Si vous vous demandiez de Uniq1001 Il s'agit d'une partie de la clé d'index en cluster ajoutée silencieusement ajoutée par le système pour agir en tant qu'affectation de l'unique que l'indice clustered n'a pas été déclaré unique. Il est vide à l'exception des lignes où il existe des copies existantes/existantes pour la valeur de CI.

12
Martin Smith