2010-12-07 75 views
2

J'ai une table qui n'a pas de clé primaire. les données sont déjà là. J'ai fait un index non groupé. mais lorsque j'exécute une requête, le plan d'exécution réel n'indique pas l'analyse d'index. Je pense que l'index non clusterisé ne fonctionne pas. Quelle pourrait être la raison. S'il vous plaît aidez-moiIndex non clusterisé ne fonctionnant pas SQL Server

+2

Vous devez fournir plus de détails!Il existe plusieurs raisons pour lesquelles l'optimiseur de requête peut décider d'ignorer l'index (si la table est très petite, si la clé d'index utilisée n'est pas suffisamment sélective, si la requête inclut des prédicats supplémentaires, etc.). Créer un script de table), le script de création d'index, la requête et le plan de requête, et aussi sans certaines statistiques sur les données, il sera très difficile de vous aider au-delà des considérations générales. – mjv

Répondre

5

Tout d'abord - pourquoi n'y a-t-il pas une clé primaire ??S'il n'a pas de clé primaire, ce n'est pas une table - il suffit d'en ajouter une! Cela aidera sur tant de niveaux ....

Deuxièmement: même si vous avez un index, l'optimiseur de requêtes SQL Server examinera toujours votre requête pour décider s'il est logique d'utiliser l'index (ou non). Si vous sélectionnez toutes les colonnes et une grande partie des lignes, l'utilisation d'un index est inutile.

Donc, les choses à éviter sont:

  • SELECT * FROM dbo.YourTable est presque garanti pas d'utiliser les indices
  • si vous ne disposez pas d'une bonne WHERE clause dans votre requête
  • si votre index est sur une colonne qui ne sélectionne pas vraiment un petit pourcentage de données; un index sur une colonne booléenne ou une colonne Gender avec au plus trois valeurs différentes ne permettent pas du tout

Sans savoir beaucoup plus sur la structure de votre table, les données contenues dans ces tableaux, le nombre de lignes , et quel genre de requêtes que vous exécutez, personne ne peut vraiment répondre à votre question - il est juste trop large ....

Mise à jour: si vous voulez créer un index ordonné en clusters sur une table qui est différent à partir de votre clé primaire, procédez comme suit:

1) Tout d'abord, concevez votre table 2) Ensuite, ouvrez le concepteur d'index - créez un nouvel index en cluster sur une colonne de votre choix. Rappelez-vous - ce n'est pas la clé primaire!

alt text

3) Après cela, vous pouvez mettre votre clé primaire sur la colonne ID - il va créer un index, mais cet indice est pas cluster!

alt text

+2

+1. Battez-moi! Je lui donnerais +5 pour "pourquoi n'y a-t-il pas une clé primaire ??" si je pouvais –

+0

merci marc_s –

1

Sans avoir plus d'informations je pense que la raison est que la table est trop petit pour un indice cherchent à valoir la peine. Si votre table contient moins de quelques milliers de lignes, SQL Server choisira presque toujours de faire une analyse de table/index indépendamment des index de cette table simplement parce qu'une analyse d'index est en fait plus rapide. Une analyse d'index en elle-même n'indique pas nécessairement un problème de performances - la requête est-elle réellement lente?

+0

table a environ 2000 lignes. Nous pouvons seulement faire un index clusterisé sur la clé primaire. mais si je crée l'index en utilisant le concepteur de table, il y a une propriété Create as Clustered. Qu'est-ce que c'est? La colonne sur laquelle je fais l'index n'est pas primaire ... –

+0

@Mohan [ce lien] (http://www.sql-server-performance.com/articles/per/index_data_structures_p1.aspx) est une bonne introduction article sur les index clusterisés - en termes simples, l'index cluster détermine l'ordre dans lequel les enregistrements sont stockés. Notez que l'index clusterisé (les tables peuvent en contenir au maximum) et la clé primaire sont des concepts complètement différents et servent des objectifs différents. des cas les mêmes colonnes sont utilisées pour les deux. – Justin

+0

@Mohan Aussi, 2000 lignes est probablement assez petit pour faire un scan de table/index le plan de requête le plus efficace (selon la taille des colonnes) - à moins que la requête soit lente, je ne m'inquiéterais pas trop. – Justin