Eh bien, la première question est facile:
Quand faut-il un index ordonné en clusters utiliser?
Toujours. Période. Sauf pour un très petit nombre de cas rares. Un index clusterisé rend un tableau plus rapide, pour chaque opération. OUI! Cela fait. Voir l'excellent The Clustered Index Debate continues de Kim Tripp pour des informations générales.Elle mentionne également ses principaux critères d'un index ordonné en clusters:
- étroite
- statique (ne change jamais)
- uniques
- si jamais possible: de plus en plus
INT IDENTITY répond à ce parfaitement - Les GUID ne le font pas. Voir GUID's as Primary Key pour plus d'informations.
Pourquoi réduire? Parce que la clé de cluster est ajoutée à chaque page d'index de chaque index non cluster sur la même table (afin de pouvoir rechercher réellement la ligne de données, si nécessaire). Vous ne voulez pas avoir VARCHAR (200) dans votre clé de clustering ....
Pourquoi unique? Voir ci-dessus - la clé de clustering est l'élément et le mécanisme que SQL Server utilise pour rechercher de manière unique une ligne de données. Cela doit être unique. Si vous choisissez une clé de clustering non unique, SQL Server ajoutera lui-même un caractère unique de 4 octets à vos clés. Faites attention à ça!
Suivant: indices non groupés. Fondamentalement, il y a une règle: toute clé étrangère dans une table enfant référençant une autre table doit être indexée, cela accélérera les JOINs et d'autres opérations.
De plus, toutes les requêtes qui ont des clauses WHERE sont un bon candidat - choisissez celles qui sont les premières à être exécutées. Placez les index sur les colonnes qui apparaissent dans les clauses WHERE, dans les instructions ORDER BY. Suivant: mesurez votre système, vérifiez les DMV (Dynamic Management Views) pour trouver des indices sur les index inutilisés ou manquants, et modifiez votre système encore et encore. C'est un processus continu, vous n'aurez jamais fini! Voir here for info sur ces deux DMV (indices manquants et non utilisés). Un autre avertissement: avec un chargement d'index, vous pouvez faire en sorte que n'importe quelle requête SELECT soit vraiment très rapide. Mais en même temps, INSERT, UPDATE et DELETE qui doivent mettre à jour tous les indices impliqués pourraient en souffrir. Si vous ne choisissez jamais - allez écrous! Sinon, c'est un acte d'équilibre délicat et délicat. Vous pouvez toujours modifier une seule requête au-delà de la croyance - mais le reste de votre système pourrait en souffrir. Ne pas sur-index votre base de données! Mettez quelques bons indices en place, vérifiez et observez le comportement du système, puis ajoutez-en un ou deux autres, et encore une fois: observez comment la performance globale du système est affectée par cela.
"Est-il acceptable d'avoir un index sur un varchar ou un datetime?" J'ai une table où l'index cluster est sur un datetime (bien que nous n'utilisions que la partie date) car toutes les requêtes sur la table sont limitées à une paire date/fin et la sélectivité des données est suffisamment élevée pour faire c'est un bon choix. – Tony