Clustered Index löschen

By Frank Kalis

Posted on Jul 12, 2004 von in SQL Server

Generell gilt, daß Indexes Datenabfragen enorm beschleunigen können. Nachteil aber ist, daß Änderungen an den Daten sich auch in Änderungen in den Indexes manifestieren, falls die entsprechenden Spalten, die von der Änderung betroffen sind, auch gleichzeitig Teil eines oder mehrerer Indexes sind. Indexes aber sind kein starres Konzept, von dem man nicht abweichen darf. So macht es zum Beispiel durchaus Sinn, vor dem Auffüllen einer Tabelle durch einen Massenimport, vorhandene Indexes auf der Tabelle zu löschen, um den Import zu beschleunigen und vielleicht innerhalb eines vorgegebenen Zeitfensters beenden zu können. Die Frage, ob in einem solchen Fall nicht besser die gesamte Tabelle gelöscht und neu erstellt wird, ignorieren wir an dieser Stelle. Sie ist ein eigenes Thema und nicht Gegenstand dieser Betrachtung.

Bevor wir uns mit den Gründen beschäftigen, warum das Löschen eines Clustered Indexes zeitintensiv sein kann, müssen wir einen kurzen Blick auf die verschiedenen Indexstrukturen werfen.

Jede Tabelle im SQL Server kann genau einen Clustered Index haben. Da der Clustered Index die Daten gemäß seiner Schlüssel sortiert, erscheint das auch einleuchtend. Besitzt eine Tabelle keinen Clustered Index, so wird diese auch als Heap bezeichnet.

Die zweite Indexstruktur im SQL Server sind Nonclustered Indexes. Sie können auf Tabellen mit Clustered Index, Heaps und Indexed Views erstellt werden.

Der Unterschied zwischen beiden Indexformen zeigt sich auf der Blattebene. Während sich dort bei einem Clustered Index die eigentlichen Daten befinden, findet man bei einem Nonclustered Index dort Verweise darauf, wo die eigentlichen Daten zu finden sind. Zwei Unterscheidungen muß man jetzt begreifen:

  1. Besitzt die Tabelle einen Clustered Index, besteht der Verweis aus den Schlüsseln des Clustered Index für diese Zeile.
  2. Besitzt die Tabellen keinen Clustered Index enthält dieser Verweis die sogenannte RowID (RID), die sich aus FileNumber:Seitennummer:Slot der Zeile zusammensetzt.

Aus diesem Sachverhalt kann man bereits ableiten, wie die effektivste Abfolge beim Löschen von Indexes aussieht. Beim Löschen eines Clustered Index muss SQL Server alle Nonclustered Indexes neu erstellen. Dabei werden die Schlüssel des Clustered Index in den Nonclustered Indexes durch die RID zu den Zeilen ersetzt. Es leuchtet ein, daß dies bei umfangreichen Tabellen und vielen Indexes schon mal Zeit in Anspruch nehmen kann. Die empfohlene Methode ist laut BOL:

"Beim Erstellen von Indizes für umfangreiche Tabellen sollten Sie möglichst mit dem gruppierten Index beginnen und dann die nicht gruppierten Indizes erstellen. Beim Löschen aller Indizes sollten Sie zunächst die nicht gruppierten Indizes und zum Schluss den gruppierten Index löschen. Auf diese Weise müssen keine Indizes neu erstellt werden."

Tags: Tags:
Dieser Eintrag wurde eingetragen von und ist abgelegt unter SQL Server. Tags: ,

Noch kein Feedback


Formular wird geladen...