SQLShack (Deutsch)
Indizes werden verwendet, um den Abfrageprozess in SQL Server zu beschleunigen, was zu einem hohen Wert führt Performance. Sie ähneln Lehrbuchindizes. Wenn Sie in Lehrbüchern zu einem bestimmten Kapitel wechseln müssen, gehen Sie zum Index, suchen Sie die Seitenzahl des Kapitels und gehen Sie direkt zu dieser Seite. Ohne Indizes wäre das Auffinden des gewünschten Kapitels sehr langsam gewesen.
Gleiches gilt für Indizes in Datenbanken. Ohne Indizes muss ein DBMS alle Datensätze in der Tabelle durchgehen, um die gewünschten Ergebnisse abzurufen. Dieser Vorgang wird als Tabellenscan bezeichnet und ist äußerst langsam. Wenn Sie dagegen Indizes erstellen, geht die Datenbank zuerst zu diesem Index und ruft dann die entsprechenden Tabellendatensätze direkt ab.
In SQL Server gibt es zwei Arten von Indizes:
- Clustered Index
- Nicht-Clustered Index
Clustered Index
Ein Clustered Index definiert die Reihenfolge, in der Daten physisch in einer Tabelle gespeichert werden. Tabellendaten können nur auf eine Weise sortiert werden, daher kann es nur einen Clustered-Index pro Tabelle geben. In SQL Server erstellt die Primärschlüsseleinschränkung automatisch einen Clustered-Index für diese bestimmte Spalte.
Schauen wir uns das an. Erstellen Sie zunächst eine „student“ -Tabelle in „schooldb“, indem Sie das folgende Skript ausführen, oder stellen Sie sicher, dass Ihre Datenbank vollständig gesichert ist, wenn Sie Ihre Live-Daten verwenden:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
CREATE DATABASE schooldb
CREATE TABLE student
(
id INT PRIMARY KEY,
name VARCHAR (50) NOT NULL,
gender VARCHAR (50) NICHT NULL,
DOB datetime NICHT NULL,
total_score INT NICHT NULL,
Stadt VARCHAR (50) NICHT NULL
)
|
Hinweis hier in der „student“ -Tabelle haben wir prima gesetzt Schlüsselbeschränkung für die Spalte „id“. Dadurch wird automatisch ein Clustered-Index für die Spalte „id“ erstellt. Um alle Indizes für eine bestimmte Tabelle anzuzeigen, führen Sie die gespeicherte Prozedur „sp_helpindex“ aus. Diese gespeicherte Prozedur akzeptiert den Namen der Tabelle als Parameter und ruft alle Indizes der Tabelle ab. Die folgende Abfrage ruft die in der Schülertabelle erstellten Indizes ab.
1
2
3
4
5
|
USE schooldb
EXECUTE sp_helpindex student
|
Die obige Abfrage gibt dieses Ergebnis zurück:
Indexname | index_description | index_keys |
PK__student__3213E83F7F60ED59 | gruppierter, eindeutiger Primärschlüssel auf der PRIMARY | -ID |
In der Ausgabe sehen Sie den einzigen Index. Dies ist der Index, der aufgrund der Primärschlüsseleinschränkung in der Spalte „id“ automatisch erstellt wurde.
Dieser Clustered-Index speichert den Datensatz in der Schülertabelle in aufsteigender Reihenfolge der „ID“. Wenn der eingefügte Datensatz die ID 5 hat, wird der Datensatz daher in die 5. Zeile der Tabelle anstelle der ersten Zeile eingefügt. Wenn der vierte Datensatz die ID 3 hat, wird er in ähnlicher Weise in die dritte Zeile anstelle der vierten Zeile eingefügt. Dies liegt daran, dass der Clustered-Index die physische Reihenfolge der gespeicherten Datensätze gemäß der indizierten Spalte, d. H. ID, beibehalten muss. Führen Sie das folgende Skript aus, um diese Reihenfolge in Aktion zu sehen:
Das obige Skript fügt zehn Datensätze in die Schülertabelle ein. Beachten Sie, dass hier die Datensätze in zufälliger Reihenfolge der Werte in der Spalte „id“ eingefügt werden. Aufgrund des standardmäßigen Clustered-Index in der Spalte „id“ werden die Datensätze jedoch physisch in aufsteigender Reihenfolge der Werte in der Spalte „id“ gespeichert. Führen Sie die folgende SELECT-Anweisung aus, um die Datensätze aus der Schülertabelle abzurufen.
1
2
3
4
5
|
USE schooldb
SELECT * FROM student
|
Die Datensätze werden in der folgenden Reihenfolge abgerufen:
Erstellen eines benutzerdefinierten Clustered-Index
Sie können Ihren eigenen benutzerdefinierten Index sowie den Standard-Clustered-Index erstellen. Um einen neuen Clustered-Index für eine Tabelle zu erstellen, müssen Sie zuerst den vorherigen Index löschen.
Um einen Index zu löschen, gehen Sie zu „Object Explorer- > Databases- > Database_Name- > Tabellen- > Tabellenname – > Indizes“. Klicken Sie mit der rechten Maustaste auf den Index, den Sie löschen möchten, und wählen Sie LÖSCHEN Siehe den folgenden Screenshot.
Nun, Führen Sie das folgende Skript aus, um einen neuen Clustered-Index zu erstellen:
1
2
3
4
5
6
|
schooldb verwenden
CLUSTERED INDEX ERSTELLEN IX_tblStudent_Gender_Score
ON student (Geschlecht ASC, total_score DESC)
|
Der Prozess von cre Der Clustering-Index ähnelt mit einer Ausnahme einem normalen Index. Bei Clustered Index müssen Sie das Schlüsselwort „CLUSTERED“ vor „INDEX“ verwenden.
Das obige Skript erstellt einen Clustered-Index mit dem Namen „IX_tblStudent_Gender_Score“ für die Schülertabelle. Dieser Index wird für die Spalten „gender“ und „total_score“ erstellt. Ein Index, der für mehr als eine Spalte erstellt wird, wird aufgerufen „Composite-Index“.
Der obige Index sortiert zuerst alle Datensätze in aufsteigender Reihenfolge des Geschlechts. Wenn das Geschlecht für zwei oder mehr Datensätze gleich ist, werden die Datensätze in absteigender Reihenfolge der Werte in ihrer Spalte „total_score“ sortiert. Sie können auch einen Clustered-Index für eine einzelne Spalte erstellen. Wenn Sie nun alle Datensätze aus auswählen In der Schülertabelle werden sie in der folgenden Reihenfolge abgerufen:
Nicht gruppierte Indizes
Ein nicht gruppierter Index sortiert die physischen Daten in der Tabelle nicht Nicht gruppierter Index wird an einem Ort gespeichert und Tabellendaten werden an einem anderen Ort gespeichert. Dies ähnelt einem Lehrbuch, bei dem sich der Buchinhalt an einem Ort und der Index an einem anderen Ort befindet. Dies ermöglicht mehr als einen nicht gruppierten Index Index pro Tabelle.
Hier ist zu erwähnen, dass die Daten innerhalb der Tabelle nach einem Clustered-Index sortiert werden. Innerhalb des Nicht-Clustered-Index werden die Daten jedoch in der angegebenen Reihenfolge gespeichert. Der Index enthält Spaltenwerte, für die der Index erstellt wird, und die Adresse des Datensatzes, zu dem der Spaltenwert gehört.
Wenn eine Abfrage für eine Spalte ausgegeben wird, für die der Index erstellt wird, wechselt die Datenbank zunächst zum Index und sucht nach der Adresse der entsprechenden Zeile in der Tabelle. Es wird dann zu dieser Zeilenadresse gehen und andere Spaltenwerte abrufen. Aufgrund dieses zusätzlichen Schritts sind nicht gruppierte Indizes langsamer als gruppierte Indizes.
Erstellen eines nicht gruppierten Index
Die Syntax zum Erstellen eines nicht gruppierten Index ähnelt der das des Clustered Index. Bei nicht gruppiertem Index wird jedoch das Schlüsselwort „NONCLUSTERED“ anstelle von „CLUSTERED“ verwendet. Schauen Sie sich das folgende Skript an.
1
2
3
4
5
6
|
schooldb verwenden
CREATE NONCLUSTERED INDEX IX_tblStudent_Name
ON student (name ASC)
|
Das obige Skript erstellt einen nicht gruppierten Index für die Spalte „name“ der Schülertabelle. Der Index wird nach Namen sortiert In aufsteigender Reihenfolge. Wie bereits erwähnt, werden die Tabellendaten und der Index an verschiedenen Stellen gespeichert. Die Tabellendatensätze werden nach einem Clustered-Index sortiert, sofern vorhanden. Der Index wird gemäß seiner Definition sortiert und separat gespeichert vom Tisch.
Studententabellendaten:
IX_tblStudent_Name-Indexdaten
name | Zeilenadresse |
Alan | Zeilenadresse |
Elis | Zeilenadresse |
Jolly | Zeilenadresse |
Jon | Zeilenadresse |
Joseph | Zeilenadresse |
Kate | Zeilenadresse |
Laura | Zeilenadresse |
Mäuse | Zeilenadresse |
Sara | Zeilenadresse |
Wise | Zeilenadresse |
Hinweis Hier im Index hat jede Zeile eine Spalte, in der die Adresse der Zeile gespeichert ist, zu der der Name gehört. Wenn also eine Abfrage ausgegeben wird, um das Geschlecht und das Geburtsdatum des Schülers mit dem Namen „Jon“ abzurufen, sucht die Datenbank zuerst nach dem Namen „Jon“ im Index. Es liest dann die Zeilenadresse von „Jon“ und geht direkt zu dieser Zeile in der „Student“ -Tabelle, um das Geschlecht und das Geburtsdatum von Jon abzurufen.
Schlussfolgerung
Aus der Diskussion Wir finden folgende Unterschiede zwischen gruppierten und nicht gruppierten Indizes.
- Es kann nur einen gruppierten Index pro Tabelle geben. Sie können jedoch mehrere nicht gruppierte Indizes für eine einzelne Tabelle erstellen.
- Clustered-Indizes sortieren nur Tabellen. Daher verbrauchen sie keinen zusätzlichen Speicherplatz. Nicht gruppierte Indizes werden an einem von der eigentlichen Tabelle getrennten Ort gespeichert, der mehr Speicherplatz beansprucht.
- Clustered-Indizes sind schneller als nicht gruppierte Indizes, da sie keinen zusätzlichen Suchschritt erfordern.
Andere großartige Artikel von Ben
Unterschied zwischen Identität & Sequenz in SQL Server
Was ist der Unterschied zwischen geclusterten und nicht geclusterten Indizes in SQL Server?
- Autor
- Letzte Beiträge
Alle Beiträge von Ben Richardson anzeigen
- Power BI: Wasserfalldiagramme und kombinierte Grafiken – 19. Januar 2021
- Power BI : Bedingte Formatierung und Datenfarben in Aktion – 14. Januar 2021
- Power BI: Importieren von Daten aus SQL Server und MySQL – 12. Januar 2021
573.279 Aufrufe
© 2021 Quest Software Inc. ALLE RECHTE VORBEHALTEN. | DSGVO | Nutzungsbedingungen | Datenschutz