Indexation des champs individuels des keys composites SQL Server

Je migre une database Jet vers SQL Server Express 2008 R2 et avant cela, je réévalue le schéma (il a été conçu en 1997-98, et le type qui l'a conçu (c'est-à-dire moi) était quelque chose d'un idiot!).

Ma question concerne les tables jointes N: N avec une key composite à deux colonnes. Dans Jet, les jointures sur la première colonne d'une key composite à deux colonnes utiliseront l'index composite, mais les jointures sur la seconde colonne ne le seront pas, en général, dans les bases de données Jet avec de grandes tables de jointure N: N avec un nombre raisonnablement élevé d'loggings , en plus de l'indice composite, j'ajoute un deuxième index non unique sur la deuxième colonne.

Est-ce une bonne idée dans SQL Server?

(Peut-être que ce n'est pas une bonne idée dans Jet?)

Les mêmes règles s'appliquent dans SQL Server. Si vous avez un index sur (ColumnA, ColumnB) une requête sur seulement ColumnA ou ColumnA et ColumnB set peut utiliser l'index, mais une requête sur seulement ColumnB ne peut pas. S'il y a un besoin de join simplement ColumnB, alors vous devez absolument créer l'index.

Si vous avez un index composite sur les colonnes (A,B) aucune opération de search, d'parsing de plage, de sorting ou d'agrégation ne peut l'utiliser pour des expressions qui contiennent uniquement B C'est vrai pour SQL Server, tout comme pour les pilotes Jet (Red) (et je pense aussi pour Jet Blue ). Certains autres moteurs peuvent l'utiliser dans une opération dite d' skip scan .

Donc, la réponse est que vous avez besoin d'index distincts sur (B) seul.

Pour vous aider plus, juste une astuce, dans le server SQL en utilisant le studio de gestion, vous pouvez évaluer la performance par "Afficher le plan d'exécution estimé". Il a montré comment fonctionnent les index et les jointures.

Vous pouvez également utiliser le DTA (Database Engine Tuning Advisor) pour plus d'informations et d'optimization.