2017-07-12 7 views
0

Je comprends que l'index clusterisé crée un arbre B et que les données réelles sont stockées dans la feuille connectée comme une liste doublement chaînée.Les données de table réelles sont-elles lues lors de l'analyse d'index en cluster dans le serveur SQL ou uniquement des pointeurs d'index?

Mais lors d'un scan d'index (en sélectionnant les données de la table sans clause "where"), le serveur SQL lit-il uniquement le pointeur d'index (nœuds non-feuille) ou lit-il réellement les données. Mon plan d'exécution montre que l'analyse d'index en cluster a 1 Go de données, ce qui est presque la même que la taille de ma table. Selon ma compréhension, l'analyse d'index SQL devrait obtenir toutes les données réelles de la table. Est-ce que j'ai râté quelque chose.

Répondre

0

index cluster lui-même est la table, donc table des pointeurs read..Index sont juste utilisés pour naviguer dans BTree

0

index cluster lui-même est la table réelle ...

Si vous créez une table directement sans index clusterisé, il s'appelle un tas - ce qui est juste un ensemble de pages non organisé (non ordonné). Chaque page pointe vers la page précédente et la page suivante (liste doublement chaînée).

Maintenant, imaginez que vous créez un index ordonné en clusters pour cette table:

Toutes les pages sont maintenant stockées dans un ordre de la clé spécifiée pour le cluster -> ce sont des pages de niveau de feuilles et contiennent des données réelles dans chaque ligne. Ceux-ci utilisent toujours la liste doublement chaînée. En outre, la structure d'index clusterisée impliquera des pages supplémentaires dans les niveaux supérieurs (pouvant être de plusieurs niveaux) afin qu'ils forment un arbre équilibré -> ce sont des pages de branches et des pages racines. Les données provenant uniquement de la clé en cluster sont utilisées comme pointeurs vers les pages des niveaux inférieurs.

Cette formation est telle que le moteur SQL peut localiser une page nécessaire pour trouver facilement les données (opération appelée SEEK), par ex. Lorsque vous exécutez une requête qui utilise un prédicat correspondant à la clé de cluster, il est capable de localiser efficacement les données exactes.

Si la clé ne correspond pas ou si SQL sait que la table est suffisamment petite (ou même lorsqu'elle sait qu'elle retourne presque toutes les données de la table), elle n'a pas besoin d'utiliser les pages de niveau supérieur. Il peut décider d'aller directement aux pages de niveau feuille pour analyser toutes les lignes et trouver les enregistrements correspondants. Souvenez-vous des doubles listes liées pour pointer vers la page précédente et suivante. Bonus: il peut y avoir un index scan même si vous spécifiez une clause WHERE car il ne peut pas utiliser la recherche ou SQL pense qu'il est plus efficace de scanner que la recherche. Faites-moi savoir si cela aide.