Plans SQL Server: différence entre l'analyse d'index / la recherche d'index

87

Dans un plan d'exécution SQL Server, quelle est la différence entre une analyse d'index et une recherche d'index

Je suis sur SQL Server 2005.

cindi
la source

Réponses:

128

Une analyse d'index est l'endroit où le serveur SQL lit l'intégralité de l'index à la recherche de correspondances - le temps que cela prend est proportionnel à la taille de l'index.

Une recherche d'index est l'endroit où le serveur SQL utilise la structure b-tree de l'index pour rechercher directement les enregistrements correspondants (voir http://mattfleming.com/node/192 pour une idée de la façon dont cela fonctionne) - le temps nécessaire n'est que proportionnel à le nombre d'enregistrements correspondants.

  • En général, une recherche d'index est préférable à une analyse d'index (lorsque le nombre d'enregistrements correspondants est proportionnellement beaucoup plus faible que le nombre total d'enregistrements), car le temps nécessaire pour effectuer une recherche d'index est constant quel que soit le nombre total d'enregistrements dans votre table.
  • Notez cependant que dans certaines situations, une analyse d'index peut être plus rapide qu'une recherche d'index (parfois beaucoup plus rapide) - généralement lorsque la table est très petite, ou lorsqu'un grand pourcentage des enregistrements correspond au prédicat.
Justin
la source
3
Le lien est-il toujours actif? pour moi ça ne marche pas. S'il vous plaît aider s'il y a un lien mis à jour
Ronak Agrawal
2
@RonakAgrawal On dirait que le lien est en fait mort - peut-être vérifier wikipedia à la place?
Justin
76

La règle de base à suivre est que les scans sont mauvais, les recherches sont bonnes.

Balayage d'index

Lorsque SQL Server effectue une analyse, il charge l'objet qu'il souhaite lire à partir du disque dans la mémoire, puis lit cet objet de haut en bas à la recherche des enregistrements dont il a besoin.

Recherche d'index

Lorsque SQL Server effectue une recherche, il sait où dans l'index les données vont se trouver, donc il charge l'index à partir du disque, va directement à la partie de l'index dont il a besoin et lit où se terminent les données dont il a besoin. . C'est évidemment une opération beaucoup plus efficace qu'une analyse, car SQL sait déjà où se trouvent les données qu'il recherche.


Comment puis-je modifier un plan d'exécution pour utiliser une recherche au lieu d'une analyse?

Lorsque SQL Server recherche vos données, l'une des choses les plus importantes qui fera basculer SQL Server d'une recherche à une analyse est lorsque certaines des colonnes que vous recherchez ne sont pas incluses dans l'index que vous souhaitez qu'il utilise. Le plus souvent, cela obligera SQL Server à effectuer une analyse d'index clusterisé, car l'index clusterisé contient toutes les colonnes de la table. C'est l'une des principales raisons (à mon avis du moins) pour laquelle nous avons maintenant la possibilité d'inclure des colonnes dans un index, sans ajouter ces colonnes aux colonnes indexées de l'index. En incluant les colonnes supplémentaires dans l'index, nous augmentons la taille de l'index, mais nous permettons à SQL Server de lire l'index, sans avoir à revenir à l'index clusterisé ou à la table elle-même pour obtenir ces valeurs.

Références

Pour plus d'informations sur les spécificités de chacun de ces opérateurs dans un plan d'exécution SQL Server, voir ....

John Sansom
la source
7

Réponse courte:

  • Balayage d'index: touchez toutes les lignes mais certaines colonnes.

  • Recherche d'index: touchez certaines lignes et certaines colonnes.

Gros yeux
la source
4

Avec une analyse d'index, toutes les lignes de l'index sont analysées pour trouver une ligne correspondante. Cela peut être efficace pour les petites tables. Avec une recherche d'index, il suffit de toucher les lignes qui répondent réellement aux critères et est donc généralement plus performant

AdaTheDev
la source
2

Une analyse d'index se produit lorsque la définition d'index ne peut pas trouver sur une seule ligne pour satisfaire les prédicats de recherche. Dans ce cas, SQL Server doit analyser plusieurs pages pour trouver une plage de lignes répondant aux prédicats de recherche.

Dans le cas d'une recherche d'index, SQL Server recherche une seule ligne correspondant aux prédicats de recherche à l'aide de la définition d' index .

Les recherches d'index sont meilleures et plus efficaces.

kevchadders
la source
0

Un scan touche chaque ligne du tableau, même si c'est ce que vous recherchez ou non

Une recherche ne regarde que les lignes que vous recherchez.

Les recherches sont toujours meilleures que les analyses car elles sont plus efficaces dans la façon dont les données sont consultées.

Une bonne explication peut être trouvée ici

AutomatedTester
la source
3
Les recherches ne sont pas toujours meilleures, par exemple si la table est relativement petite et qu'un grand pourcentage des lignes de cette table doivent être renvoyées, une analyse d'index peut finir par être beaucoup plus efficace.
Justin
1
Salut Justin, je suppose que tu veux dire que les scans de table peuvent parfois être meilleurs. La recherche d'index est toujours meilleure qu'une analyse d'index, sauf si nous parlons de cluster. Mais, parfois, une analyse de table ou une analyse d'index en cluster peut être plus efficace pour la raison que vous avez mentionnée. Au lieu de rechercher l'index et d'obtenir les champs ne sont pas dans l'index de la table, parfois, ms sql utilisera la table même si l'index a le champ de critères.
Jose Areas