96 votes

Les index clusterisés doivent-ils être uniques?

Qu'advient-il si un index cluster est pas unique? Peut-elle conduire à de mauvaises performances, car inséré les lignes de flux à un "dépassement" de la page de certains types?

Est-il "fait" unique et si oui, comment? Quel est le meilleur moyen pour le rendre unique?

Je demande car je suis actuellement en utilisant un index cluster de diviser ma table dans les parties logiques, mais la performance est so-so, et récemment, j'ai eu les conseils pour faire mon index cluster unique. Je voudrais un deuxième avis sur l'.

Merci!

108voto

Lieven Keersmaekers Points 32396

Ils n' ont à être unique, mais il est certainement encouragé.
Je n'ai pas rencontré un scénario encore où je voulais créer un IC sur un non-colonne unique.

Qu'advient-il si vous créer un IC sur un non-colonne unique

Si l'index cluster n'est pas unique index, SQL Server fait tout en double touches uniques en ajoutant un à l'interne valeur générée appelé un indicateur d'unicité

Cela conduit à de mauvaises performances?

L'ajout d'un indicateur d'unicité ajoute certainement une surcharge en calcul et en stockage.
Si cette surcharge est à noter dépend de plusieurs facteurs.

  • Le nombre de données de la table contiennent.
  • Quel est le taux de plaquettes.
  • Quelle est la fréquence de l'IC utilisé dans un select (lorsqu'aucune couvrant indices existent, à peu près toujours).

Modifier
comme cela a été souligné par Remus dans les commentaires, il existe des cas d'utilisation où la création d'un non-unique CI serait un choix raisonnable. Moi de ne pas avoir rencontré l'un de ces scénarios affiche simplement mon propre manque d'exposition ou de compétence (faites votre choix).

35voto

marc_s Points 321990

J'aime savoir ce que La Reine de l'Indexation, Kimberly Tripp, a à dire sur le sujet:

Je vais commencer avec ma recommandation pour la Clé de cluster - pour un couple de raisons. Tout d'abord, c'est une décision facile à prendre et, deuxièmement, la prise de cette décision précoce permet de prévenir de manière proactive certains types de fragmentation. Si vous pouvez éviter certains types de base-fragmentation de la table, alors vous pouvez réduire certaines activités de maintenance (dont une partie dans SQL Server 2000 ET moins de ce qui, dans SQL Server 2005) exige que votre table soit en mode hors connexion. OK, je vais arriver à le reconstruire tout ça plus tard.....

Commençons avec la clé de choses que je recherche dans une clé de cluster:

* Unique
* Narrow
* Static

Pourquoi Est-Il Unique? Une clé de cluster doit être unique, car une clé de clustering (quand il existe) est utilisé comme la recherche de la clé de tous les index non cluster. Prenez par exemple un index à la fin d'un livre - si vous avez besoin de trouver les données que d'un index des points d'entrée à l'entrée (de l'entrée d'index) doit être unique, sinon, qui d'entrée d'index serait celui que vous cherchez? Ainsi, lorsque vous créez l'index cluster - il doit être unique. Mais, SQL Server ne nécessite pas que votre clé de cluster est créé sur une colonne unique. Vous pouvez le créer sur n'importe quelle colonne(s) que vous souhaitez. En interne, si la clé de cluster n'est pas unique, SQL Server "uniquify" par l'ajout d'un entier de 4 octets pour les données. Donc, si l'index cluster est créé sur quelque chose qui n'est pas unique, alors non seulement il y a une charge supplémentaire à la création de l'index, il y a de l'espace disque gaspillé, des coûts supplémentaires pour les Insertions et Mises à jour, et dans SQL Server 2000, il y a un coût supplémentaire sur un cluster de reconstruction d'index (qui, à cause du mauvais choix de la clé de cluster est maintenant plus probable).

Source: augmentation croissante de la clé de cluster débat - nouveau!

11voto

ChrisW Points 37322

Faire des index cluster doivent être unique?

Ils ne sont pas, et il y a des moments où il vaut mieux s'ils ne le sont pas.

Envisager une table avec un semi-aléatoire, unique Employé, et un DepartmentId pour chaque employé: si votre instruction select SELECT * from table employeetable OÙ DepartmentId=%DepartmentValue% puis il est le meilleur pour les performances si les DepartmentId est l'index cluster, même (voire surtout parce que) ce n'est pas l'index unique (le meilleur pour les performances, car il s'assure que tous les dossiers à l'intérieur d'un DepartmentId sont regroupés).


Avez-vous des références?

Il y a d'Index Cluster des lignes Directrices de Conception par exemple, qui dit,

À quelques exceptions près, chaque table doit avoir un index cluster défini sur la ou les colonnes, qui offrent suivantes:

  • Peut être utilisé pour les requêtes fréquemment utilisées.
  • Fournir un degré élevé de spécificité.
  • Peut être utilisé dans la gamme des requêtes.

Ma compréhension de "haut degré d'unicité" par exemple, c'est qu'il n'est pas bon de choisir des "Pays" comme le clusted index si la plupart de vos requêtes souhaitez sélectionner les dossiers à l'intérieur d'une ville donnée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X