Pourquoi ma key primaire ralentit-elle mes requêtes?

J'utilise SQL Server 2008 et, dans l'une de mes tables, j'ai implémenté une key primaire (en grappe) sur son identifiant. Voici la description de la table:

Identificateur: – IdentifierId int NOT NULL PK – Alias ​​nvarchar (200) – DataType int NOT NULL

J'ai fait deux index: un pour Alias ​​et un autre pour DataType. Cependant, j'ai juste remarqué quelque chose d'étrange. Lors de l'exécution de la requête suivante:

SELECT * FROM IDENTIFIER WHERE DataType = 1 

La requête s'exécute plus lentement avec les index et la key primaire que sans eux; cela prend environ 10 secondes de plus! Les index ne sont pas fragmentés – j'ai vérifié – et j'utilise aussi ceci

 GO CHECKPOINT; GO DBCC DROPCLEANBUFFERS; GO DBCC FREEPROCCACHE; GO 

avant la requête elle-même.

Cette table est plutôt grande, avec plusieurs millions d'inputs. Les index et PKs jouent un rôle essentiel sur la plupart des requêtes, mais dans ce cas je ne comprends pas pourquoi la requête est plus lente avec eux. Des idées?

Merci d'avance

EDIT: Le plan d'exécution montre que seul l'index cluster est utilisé et la variable DataType va jusqu'à 150.

Créez un index de couverture composite non cluster sur DataType avec l' Alias colonne inclus et supprimez les index individuels sur les colonnes Alias et DataType :

 CREATE NONCLUSTERED INDEX NC_DataType_I_Alias ON tblIdentifier(DataType) INCLUDE (Alias) 

Lorsque vous select *, le système aura toujours besoin de toutes les colonnes. L'optimiseur détermine donc souvent qu'il est plus rapide d'utiliser l'index clusterisé (callbackez-vous qu'un index clusterisé n'est pas vraiment un index – il s'agit simplement de données organisées par ordre spécifié) que d'utiliser une search sur un index différent associé à une search de signet basé sur la key primaire pour récupérer les lignes supplémentaires.

La key de la performance est donc d'avoir un index non cluster (c'est un mauvais nom, en réalité, puisque les index non clusterisés surpassent souvent largement les index clusterisés) et INCLUDE des colonnes supplémentaires dans l'index pour qu'il devienne covering . Dans le cas de pré-SQL Server 2005, vous devez simplement append les colonnes à la fin de l'index.

Donc, fondamentalement, une key primaire est bonne, mais ne doit pas nécessairement déterminer votre choix de clustering, et vous devrez généralement countr sur des index non cluster (avec des colonnes INCLUDE ed appropriées) pour les performances sur la plupart des opérations sélectives, avec l'index clusterisé conçu pour le cas le less sélectif et le plus souvent sortingé.