Index en grappe
Un index en grappe est en fait une table organisée en arborescence. Au lieu de stocker les enregistrements dans un espace de table Heap non trié, l'index clusterisé est en fait un index B+Tree dont les nœuds feuilles, qui sont ordonnés par la valeur de la colonne clé des clusters, stockent les enregistrements réels de la table, comme l'illustre le diagramme suivant.
L'index en grappe est la structure de table par défaut dans SQL Server et MySQL. Alors que MySQL ajoute un index clusterisé caché même si une table ne possède pas de clé primaire, SQL Server construit toujours un index clusterisé si une table possède une colonne de clé primaire. Dans le cas contraire, le serveur SQL est stocké comme une table de type Heap.
L'index en grappe peut accélérer les requêtes qui filtrent les enregistrements par la clé de l'index en grappe, comme les instructions CRUD habituelles. Puisque les enregistrements sont situés dans les nœuds feuilles, il n'y a pas de recherche supplémentaire pour les valeurs de colonnes supplémentaires lors de la localisation des enregistrements par leurs valeurs de clé primaire.
Par exemple, lorsque vous exécutez la requête SQL suivante sur le serveur SQL :
SELECT PostId, Title
FROM Post
WHERE PostId = ?
Vous pouvez voir que le plan d'exécution utilise une opération de recherche d'index en grappe pour localiser le nœud feuille contenant l'objet Post
et il n'y a que deux lectures logiques nécessaires pour analyser les nœuds de l'index en grappe :
|StmtText |
|-------------------------------------------------------------------------------------|
|SELECT PostId, Title FROM Post WHERE PostId = @P0 |
| |--Clustered Index Seek(OBJECT:([high_performance_sql].[dbo].[Post].[PK_Post_Id]), |
| SEEK:([high_performance_sql].[dbo].[Post].[PostID]=[@P0]) ORDERED FORWARD) |
Table 'Post'. Scan count 0, logical reads 2, physical reads 0
Index non clusterisé
Étant donné que l'index clusterisé est généralement construit à partir des valeurs de la colonne de la clé primaire, si vous souhaitez accélérer les requêtes qui utilisent une autre colonne, vous devrez ajouter un index secondaire non clusterisé.
L'index secondaire va stocker la valeur de la clé primaire dans ses nœuds feuilles, comme l'illustre le schéma suivant :
Ainsi, si nous créons un index secondaire sur le fichier Title
de la colonne Post
table :
CREATE INDEX IDX_Post_Title on Post (Title)
Et nous exécutons la requête SQL suivante :
SELECT PostId, Title
FROM Post
WHERE Title = ?
Nous pouvons voir qu'une opération de recherche d'index est utilisée pour localiser le nœud feuille dans le fichier de données. IDX_Post_Title
qui peut fournir la projection de la requête SQL qui nous intéresse :
|StmtText |
|------------------------------------------------------------------------------|
|SELECT PostId, Title FROM Post WHERE Title = @P0 |
| |--Index Seek(OBJECT:([high_performance_sql].[dbo].[Post].[IDX_Post_Title]),|
| SEEK:([high_performance_sql].[dbo].[Post].[Title]=[@P0]) ORDERED FORWARD)|
Table 'Post'. Scan count 1, logical reads 2, physical reads 0
Etant donné que les PostId
La valeur de la colonne Primary Key est stockée dans le IDX_Post_Title
cette requête n'a pas besoin d'une recherche supplémentaire pour localiser l'élément Post
dans l'index en grappe.
2 votes
Ces deux vidéos ( Structures d'index groupés et non groupés dans SQL Server y Conception de bases de données 39 - Index (clusterisé, non clusterisé, index composite) ) sont, à mon avis, plus utiles qu'une réponse en texte clair.