Quelle est la différence entre une analyse de table et une analyse d'index clusterisée?


63

Étant donné qu'un Table Scan et un Clustered Index Scan analysent essentiellement tous les enregistrements du tableau, pourquoi un index clusterisé est-il supposé être meilleur?

À titre d'exemple - quelle est la différence de performance entre les suivantes quand il y a beaucoup de dossiers ?:

declare @temp table(
    SomeColumn varchar(50) 
) 

insert into @temp 
select 'SomeVal' 

select * from @temp 

----------------------------- 

declare @temp table(
    RowID int not null identity(1,1) primary key, 
    SomeColumn varchar(50) 
) 

insert into @temp 
select 'SomeVal' 

select * from @temp 
70

Dans une table sans index cluster (table de segments), les pages de données ne sont pas liées entre elles. Par conséquent, les pages traversées nécessitent un lookup into the Index Allocation Map.

Une table en cluster, cependant, a data pages linked in a doubly linked list - rendant les analyses séquentielles un peu plus rapides. Bien sûr, en échange, vous avez l'avantage de gérer les pages de données dans l'ordre sur INSERT, UPDATE et DELETE. Une table de tas, cependant, nécessite une seconde écriture à l'IAM.

Si votre requête a un opérateur RANGE (par exemple .: SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100), puis une table cluster (étant dans un ordre garanti) serait plus efficace - car elle pourrait utiliser les pages d'index pour trouver la page de données pertinentes (s). Un tas devrait scanner toutes les lignes, puisqu'il ne peut pas compter sur la commande. Et, bien sûr, un index clusterisé vous permet de faire un RECHERCHE D'INDICE CLUSTERED, ce qui est plutôt optimal pour les performances ... un tas sans index entraînerait toujours un scan de la table.

Alors:

  • Pour votre exemple requête vous permet de sélectionner toutes les lignes, la seule différence est la liste doublement chaînée un index ordonné en clusters maintient. Cela devrait rendre votre table en cluster juste un peu plus rapide qu'un tas avec un grand nombre de lignes. Pour une requête avec une clause WHERE qui peut être satisfaite (au moins partiellement) par l'index clusterisé, vous en sortirez en raison de la commande - vous n'aurez donc pas besoin d'analyser toute la table. Pour une requête qui n'est pas satisfaite par l'index clusterisé, vous êtes à peu près égal ... encore une fois, la seule différence étant cette liste doublement liée pour l'analyse séquentielle.Dans les deux cas, vous êtes sous-optimal.

  • Pour INSERT, UPDATE et DELETE un tas peut gagner ou ne pas gagner. Le tas n'a pas besoin de maintenir l'ordre, mais nécessite une seconde écriture dans l'IAM. Je pense que la différence de performance relative serait négligeable, mais aussi dépendante des données.

Microsoft a une whitepaper qui compare un index ordonné en clusters à un équivalent index non cluster sur un tas (pas exactement la même chose que je discutais ci-dessus, mais à proximité). Leur conclusion est essentiellement de mettre un index clusterisé sur toutes les tables. Je ferai de mon mieux pour résumer leurs résultats (encore une fois, notez qu'ils comparant vraiment un index non cluster à un index ordonné en clusters ici - mais je pense qu'il est relativement comparable):

  • performances INSERT: index cluster gagne d'environ 3% en raison de la deuxième écriture nécessaire pour un tas. Performance: l'index clusterisé gagne environ 8% en raison de la deuxième recherche nécessaire pour un segment de mémoire.
  • DELETE performance: index cluster victoires d'environ 18% en raison de la seconde recherche nécessaires et la deuxième suppression nécessaire de l'IAM pour un tas. Performance: l'index clusterisé gagne environ 16% en raison de la deuxième recherche nécessaire pour un segment de mémoire. Performance: l'index clusterisé gagne environ 29% en raison de l'ordre aléatoire pour un segment de mémoire.
  • concurrente INSERT: la table heap gagne 30% sous charge en raison des séparations de page pour l'index clusterisé.
+1

Cette même question a bouillonné dans mon esprit aujourd'hui. Merci @Terrapin de nous avoir posé cette question et merci à @Marc d'y répondre si bien! 01 mai. 112011-05-01 18:53:22

+1

Examen MS 70461 Interrogation de Microsoft SQL Server 2012 - Chapitre 15 Leçon 1 a une exploitation approfondie. 13 janv.. 152015-01-13 23:28:57

  0

Je ne peux pas sembler obtenir le boost supposé indiqué par cette déclaration: "Pour une requête avec une clause WHERE qui peut être (au moins partiellement) satisfaite par l'index cluster, vous sortirez en avance en raison de la commande - Vous n'aurez donc pas à scanner toute la table. " J'ai une table de 10 millions de lignes. SELECT ID FROM Client WHERE Id> X s'exécute dans le même laps de temps, peu importe si j'ai un index clusterisé sur Id ou non. Comment venir? Je peux voir comment cela passe de l'analyse de table à l'analyse d'index clusterisée. 30 avril. 152015-04-30 07:17:40

+2

@MattiasNordqvist - Si vous regardez juste le temps pris, vous le faites mal. En raison de la mise en cache, de l'accès simultané, du temps CPU par rapport au disque, etc., il est difficile de régler MS-SQL à temps. Regardez dans SET STATISTICS IO ON pour vérifier vos lectures de disque, d'où viendrait le boost. Deuxièmement, cela dépendra du nombre de lignes retournées - si c'est un pourcentage suffisamment élevé, l'optimiseur pourrait choisir un filtre read + à la place. 30 avril. 152015-04-30 19:42:44


-2

Une analyse de table doit examiner chaque ligne unique de la table. L'analyse d'index en cluster doit uniquement analyser l'index. Il n'analyse pas tous les enregistrements de la table. C'est le point, vraiment, des indices.

+7

-1 Ceci est faux. Le niveau feuille de l'index clusterisé * est * la table. 14 févr.. 142014-02-14 19:05:25


4

http://msdn.microsoft.com/en-us/library/aa216840(SQL.80).aspx

l'index cluster de numérisation opérateur logique et physique balaye l'index cluster spécifié dans la colonne Argument. Lorsqu'un prédicat facultatif WHERE :() est présent, seules les lignes qui satisfont le prédicat sont renvoyées. Si la colonne Argument contient la clause ORDERED, le processeur de requêtes a demandé que la sortie des lignes soit renvoyée dans l'ordre dans lequel l'index clusterisé les a triées. Si la clause ORDERED n'est pas présente, le moteur de stockage analyse l'index de la manière optimale (ne garantissant pas la sortie à trier).

http://msdn.microsoft.com/en-us/library/aa178416(SQL.80).aspx

Le tableau de numérisation opérateur logique et physique récupère toutes les lignes de la table spécifiée dans la colonne Argument. Si un prédicat WHERE :() apparaît dans la colonne Argument, seules les lignes qui satisfont le prédicat sont renvoyées.