Geclusterter Index
Ein Clustered Index ist im Grunde eine baumartig organisierte Tabelle. Anstatt die Datensätze in einem unsortierten Heap-Tabellenraum zu speichern, ist der geclusterte Index eigentlich ein B+Tree-Index, bei dem die Blattknoten, die nach dem Spaltenwert des Cluster-Schlüssels geordnet sind, die eigentlichen Tabellendatensätze speichern, wie im folgenden Diagramm dargestellt.
Der Clustered Index ist die Standardtabellenstruktur in SQL Server und MySQL. Während MySQL einen versteckten Cluster-Index hinzufügt, auch wenn eine Tabelle keinen Primärschlüssel hat, baut SQL Server immer einen Cluster-Index auf, wenn eine Tabelle eine Primärschlüsselspalte hat. Andernfalls wird der SQL Server als Heap-Tabelle gespeichert.
Der geclusterte Index kann Abfragen beschleunigen, die Datensätze nach dem Schlüssel des geclusterten Index filtern, wie die üblichen CRUD-Anweisungen. Da sich die Datensätze in den Leaf Nodes befinden, gibt es keine zusätzliche Suche nach zusätzlichen Spaltenwerten, wenn Datensätze nach ihren Primärschlüsselwerten gesucht werden.
Wenn Sie zum Beispiel die folgende SQL-Abfrage auf SQL Server ausführen:
SELECT PostId, Title
FROM Post
WHERE PostId = ?
Sie können sehen, dass der Ausführungsplan eine Clustered Index Seek-Operation verwendet, um den Blattknoten zu finden, der die Post
Datensatz, und es sind nur zwei logische Lesevorgänge erforderlich, um die Clustered Index-Knoten zu scannen:
|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
Nicht-geclusterter Index
Da der geclusterte Index in der Regel anhand der Werte der Primärschlüsselspalte erstellt wird, müssen Sie einen sekundären, nicht geclusterten Index hinzufügen, wenn Sie Abfragen beschleunigen möchten, die eine andere Spalte verwenden.
Der Sekundärindex speichert den Wert des Primärschlüssels in seinen Blattknoten, wie im folgenden Diagramm dargestellt:
Wenn wir also einen sekundären Index für die Datei Title
Spalte der Post
Tisch:
CREATE INDEX IDX_Post_Title on Post (Title)
Und wir führen die folgende SQL-Abfrage aus:
SELECT PostId, Title
FROM Post
WHERE Title = ?
Wir können sehen, dass eine Index-Suchoperation verwendet wird, um den Blattknoten in der IDX_Post_Title
Index, der die gewünschte SQL-Abfrageprojektion liefern kann:
|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
Da die damit verbundenen PostId
Der Wert der Primärschlüsselspalte wird in der IDX_Post_Title
Leaf Node, benötigt diese Abfrage keine zusätzliche Suche, um den Post
Zeile im geclusterten Index.