Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-Heap vs. geclusterter Index

Heap-Speicher hat nichts mit diesen Heaps zu tun .

Heap bedeutet lediglich, dass die Datensätze selbst nicht geordnet (d. h. nicht miteinander verknüpft) sind.

Wenn Sie einen Datensatz einfügen, wird er einfach in den freien Speicherplatz eingefügt, den die Datenbank findet.

Das Aktualisieren einer Zeile in einer Heap-basierten Tabelle wirkt sich nicht auf andere Datensätze aus (obwohl es sich auf sekundäre Indizes auswirkt)

Wenn Sie einen sekundären Index auf einem HEAP erstellen Tabelle, die RID (eine Art physikalischer Zeiger auf den Speicherplatz) wird als Zeilenzeiger verwendet.

Gruppierter Index bedeutet, dass die Datensätze Teil eines B-Tree sind . Wenn Sie einen Datensatz einfügen, wird der B-Tree muss neu verknüpft werden.

Das Aktualisieren einer Zeile in einer geclusterten Tabelle verursacht eine Neuverknüpfung des B-Baums, d. e. Aktualisierung interner Zeiger in anderen Datensätzen.

Wenn Sie einen sekundären Index für eine gruppierte Tabelle erstellen, wird der Wert des gruppierten Indexschlüssels als Zeilenzeiger verwendet.

Das bedeutet, dass ein gruppierter Index eindeutig sein sollte. Wenn ein Clustered-Index nicht eindeutig ist, wird eine spezielle versteckte Spalte namens uniquifier angezeigt wird an den Indexschlüssel angehängt, der if unique (und größer) macht.

Es ist auch erwähnenswert, dass das Erstellen eines sekundären Indexes für eine Spalte die Werte oder den Schlüssel des gruppierten Indexes zum Teil des Schlüssels des sekundären Indexes macht.

Indem Sie einen Index für eine geclusterte Tabelle erstellen, erhalten Sie tatsächlich immer einen zusammengesetzten Index

CREATE UNIQUE CLUSTERED INDEX CX_mytable_1234 (col1, col2, col3, col4)

CREATE INDEX IX_mytable_5678 (col5, col6, col7, col8)

Index IX_mytable_5678 ist tatsächlich ein Index für die folgenden Spalten:

col5
col6
col7
col8
col1
col2
col3
col4

Das hat noch einen Nebeneffekt:

Ein DESC Bedingung in einem einspaltigen Index für eine gruppierte Tabelle ist in SQL Server sinnvoll

Dieser Index:

CREATE INDEX IX_mytable ON mytable (col1)

kann in einer Abfrage wie dieser verwendet werden:

SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id

, während dieses:

CREATE INDEX IX_mytable ON mytable (col1 DESC)

kann in einer Abfrage wie dieser verwendet werden:

SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id DESC