J'ai une table qui stocke des millions de lignes. Il ressemble à ceci:Dois-je créer un index cluster unique ou un index cluster non unique sur cette table SQL 2005?
Table_Docs
ID, Bigint (Identity col)
OutputFileID, int
Sequence, int
…(many other fields)
Nous nous trouvons dans une situation où le développeur qui a conçu le fait OutputFileID l'index cluster. Ce n'est pas unique. Il peut y avoir des milliers d'enregistrements avec cet ID. Il n'a aucun avantage pour les processus utilisant cette table, donc nous prévoyons de l'enlever.
La question, est ce que pour le changer à ... J'ai deux candidats, la colonne identité ID est un choix naturel. Cependant, nous avons un processus qui fait beaucoup de commandes de mise à jour sur cette table, et il utilise la séquence pour le faire. La séquence est non unique. La plupart des enregistrements n'en contiennent qu'un, mais environ 20% peuvent avoir deux ou plusieurs enregistrements avec la même séquence.
L'application INSERT est une pièce VB6 qui lance des milliers d'instructions d'insertion à la table. Les valeurs insérées ne sont jamais dans un ordre particulier. Ainsi, la séquence d'un insert peut être 12345, et la suivante pourrait être 12245. Je sais que cela pourrait amener SQL à déplacer beaucoup de données pour garder l'index cluster dans l'ordre. Cependant, la séquence des inserts est généralement proche d'être en ordre. Toutes les insertions auraient lieu à la fin de la table en cluster. Ex: J'ai 5 millions de disques avec une séquence de 1 à 5 millions. L'application INSERT insérera des séquences à la fin de cette plage à tout moment. La réorganisation des données devrait être minimale (des dizaines de milliers d'enregistrements au maximum).
Maintenant, l'application UPDATE est notre étoile .NET. Il effectue toutes les mises à jour dans la colonne Séquence. “Update Table_Docs Set Feild1=This, Field2=That…WHERE Sequence =12345”
- des centaines de milliers d'entre eux par jour. Les mises à jour sont complètement et totalement, au hasard, toucher tous les points de la table.
Tous les autres processus font simplement des SELECT sur ce (pages Web). Les index réguliers couvrent ceux-ci. Donc, ma question est, quoi de mieux ... .un index cluster unique sur la colonne ID, bénéficiant de l'application INSERT, ou un index cluster non unique sur la séquence, bénéficiant de l'application UPDATE?
Bonne réponse. J'ai vu la bannière disant qu'une réponse avait été ajoutée au moment où je me présentais. – TimothyAWiseman
Merci. Je vais lire ce lien ce week-end. Je veux prendre une décision éclairée. Je devrais indiquer que mon index groupé de «Sequence» serait: • étroit (c'est un int) • statique (ne change jamais) • presque unique (très limité duplique 10-20% de tous les enregistrements au maximum et limité à moins de 5 lignes pour chaque doublon) • toujours croissant Est-ce une exception à la règle, compte tenu de ce que nous faisons? – Bremer
@Bremer: si votre clé de cluster n'augmente pas, vous devrez gérer les divisions de page lorsque vous insérerez une nouvelle ligne au milieu d'une page entière -> pas si bon pour la performance. –