Spezielle Richtlinien für partitionierte Indizes
Obwohl partitionierte Indizes unabhängig von ihren Basistabellen implementiert werden können, ist es allgemein sinnvoll, eine partitionierte Tabelle zu entwerfen und anschließend einen Index für diese Tabelle zu erstellen. Dabei partitioniert SQL Server automatisch den Index, wobei dasselbe Partitionsschema und dieselbe Partitionsspalte wie für die Tabelle verwendet wird. Im Ergebnis wird der Index im Wesentlichen in derselben Weise wie die Tabelle partitioniert. Damit ist der Index an der Tabelle ausgerichtet.
SQL Server richtet den Index nicht an der Tabelle aus, wenn Sie zum Erstellungszeitpunkt ein anderes Partitionsschema oder eine separate Dateigruppe für den Index angeben.
Das Ausrichten eines Index an einer partitionierten Tabelle ist insbesondere wichtig, wenn Sie erwarten, dass sie sich durch die Aufnahme weiterer Partitionen erweitern wird oder dass sie an häufigen Partitionswechseln beteiligt sein wird. Weitere Informationen finden Sie unter Entwerfen von Partitionen zum Verwalten von Datenteilmengen. Wenn eine Tabelle und ihre Indizes aneinander ausgerichtet sind, kann SQL Server schnell zwischen Partitionen wechseln und gleichzeitig die Partitionsstruktur sowohl der Tabelle als auch ihrer Indizes beibehalten.
Hinweis |
---|
Ein Index muss nicht an derselben benannten Partitionsfunktion beteiligt sein, um an ihrer Basistabelle ausgerichtet zu sein. Allerdings muss die Partitionsfunktion des Index und der Basistabelle im Wesentlichen übereinstimmen, und zwar dahingehend, dass 1) die Argumente der Partitionsfunktionen denselben Datentyp haben, dass sie 2) dieselbe Anzahl von Partitionen definieren und dass sie 3) dieselben Begrenzungswerte für Partitionen definieren. |
Auf der Optimierungsoptionen-Registerkarte des Datenbankmodul-Optimierungsratgebers gibt es die Ausgerichtete Partitionierung-Einstellung, mit der Sie angeben können, dass neue empfohlene Indizes an ihren Basistabellen ausgerichtet werden. Die Ausgerichtete Partitionierung beibehalten-Einstellung kann für denselben Zweck und außerdem zum Löschen vorhandener nicht ausgerichteter Indizes verwendet werden. Weitere Informationen finden Sie unter Datenbankoptimierungsratgeber (Registerkarte 'Optimierungsoptionen'). Ganz allgemein kann der Datenbankmodul-Optimierungsratgeber zur Leistungssteigerung empfohlener Indizes verwendet werden, wobei es sich um eine Mischung aus ausgerichteten und nicht ausgerichteten Indizes handeln kann. Weitere Informationen finden Sie unter Datenbankoptimierungsratgeber (Übersicht).
Das Entwerfen eines partitionierten Index unabhängig von der Basistabelle (also nicht ausgerichtet an der Basistabelle) kann in den folgenden Fällen nützlich sein:
Die Basistabelle ist nicht partitioniert.
Der Indexschlüssel ist eindeutig und enthält nicht die Partitionierungsspalte der Tabelle.
Sie möchten die Basistabelle an abgestimmten Verknüpfungen mit weiteren Tabellen beteiligen, die unterschiedliche Verknüpfungsspalten verwenden.
Hinweis |
---|
Um das Wechseln von Partitionen zu ermöglichen, müssen alle Indizes für die Tabelle ausgerichtet sein. |
Beachten Sie beim Erstellen von partitionierten Indizes die Informationen in den folgenden Abschnitten.
Partitionieren eindeutiger Indizes
Beim Partitionieren eines eindeutigen Index (gruppiert oder nicht gruppiert) muss die Partitionierungsspalte aus den Spalten ausgewählt werden, die im eindeutigen Indexschlüssel verwendet werden.
Hinweis |
---|
Diese Einschränkung ermöglicht es SQL Server, nur eine einzelne Partition zu untersuchen, um sicherzustellen, dass in der Tabelle nicht bereits ein Duplikat eines neuen Schlüsselwerts vorhanden ist. |
Wenn es nicht möglich ist, die Partitionierungsspalte in den eindeutigen Schlüssel einzubeziehen, müssen Sie einen DML-Trigger verwenden, statt die Eindeutigkeit zu erzwingen.
Partitionieren gruppierter Indizes
Beim Partitionieren eines gruppierten Index muss der Gruppierungsschlüssel die Partitionierungsspalte enthalten. Wenn beim Partitionieren eines nicht eindeutigen gruppierten Index die Partitionierungsspalte nicht explizit im Gruppierungsschlüssel angegeben ist, fügt SQL Server die Partitionierungsspalte standardmäßig zur Liste der gruppierten Indexschlüssel hinzu. Wenn der gruppierte Index eindeutig ist, müssen Sie explizit angeben, dass der gruppierte Indexschlüssel die Partitionierungsspalte enthält.
Partitionieren nicht gruppierter Indizes
Beim Partitionieren eines eindeutigen nicht gruppierten Index muss der Indexschlüssel die Partitionierungsspalte enthalten. Beim Partitionieren eines nicht eindeutigen, nicht gruppierten Index fügt SQL Server die Partitionierungsspalte standardmäßig als eine Nichtschlüsselspalte (eingeschlossene Spalte) des Index hinzu, um sicherzustellen, dass der Index an der Basistabelle ausgerichtet ist. SQL Server fügt die Partitionierungsspalte nicht zum Index hinzu, wenn sie bereits im Index vorhanden ist.
Arbeitsspeichereinschränkungen und partitionierte Indizes
Arbeitsspeichereinschränkungen können sich negativ auf die Leistung oder auf die Möglichkeit von SQL Server zum Erstellen eines partitionierten Index auswirken. Das gilt insbesondere für den Fall, wenn der Index nicht an seiner Basistabelle oder an derem gruppierten Index ausgerichtet ist, sofern für die Tabelle bereits ein gruppierter Index erstellt wurde.
Wenn SQL Server Sortiervorgänge zum Erstellen partitionierter Indizes durchführt, erstellt es zuerst eine Sortiertabelle für jede Partition. Anschließend erstellt es die Sortiertabellen entweder in der jeweiligen Dateigruppe jeder Partition oder in tempdb, wenn die SORT_IN_TEMPDB-Indexoption angegeben wurde.
Jede Sortiertabelle setzt für ihre Erstellung eine Mindestmenge an Arbeitsspeicher voraus. Wenn Sie einen partitionierten Index erstellen, der an seiner Basistabelle ausgerichtet ist, werden alle Sortiertabellen nacheinander erstellt, was weniger Arbeitsspeicher in Anspruch nimmt. Wenn Sie allerdings einen nicht gruppierten partitionierten Index erstellen, werden alle Sortiertabellen gleichzeitig erstellt.
Das heißt, es muss ausreichend Arbeitsspeicher verfügbar sein, um diese gleichzeitigen Sortiervorgänge zu verarbeiten. Je größer die Anzahl der Partitionen, desto mehr Arbeitsspeicher wird benötigt. Die Mindestgröße für jede Sortiertabelle beträgt 40 Seiten für jede Partition mit 8 Kilobyte pro Seite. So beansprucht z. B. ein nicht ausgerichteter partitionierter Index mit 100 Partitionen ausreichend Arbeitsspeicher, um 4.000 (40 * 100) Seiten gleichzeitig seriell sortieren zu können. Wenn dieser Arbeitsspeicher verfügbar ist, ist die Erstellung zwar erfolgreich, jedoch kann die Leistung darunter leiden. Wenn dieser Arbeitsspeicher nicht verfügbar ist, schlägt die Erstellung fehl. Alternativ erfordert ein ausgerichteter partitionierter Index mit 100 Partitionen nur ausreichend Arbeitsspeicher, um 40 Seiten zu sortieren, da die Sortiervorgänge nicht gleichzeitig durchgeführt werden.
Sowohl bei ausgerichteten als auch bei nicht ausgerichteten Indizes kann der Arbeitsspeicherbedarf noch höher sein, wenn SQL Server bei einem Computer mit mehreren Prozessoren Grade der Parallelität beim Erstellungsvorgang verwendet. Denn je höher die Grade der Parallelität sind, desto größer ist auch der Arbeitsspeicherbedarf. Wenn SQL Server z. B. die Grade der Parallelität auf 4 festlegt, benötigt ein nicht ausgerichteter partitionierter Index mit 100 Partitionen ausreichend Arbeitsspeicher, damit vier Prozessoren gleichzeitig jeweils 4.000 Seiten sortieren können – also 6.000 Seiten gleichzeitig. Wenn der partitionierte Index ausgerichtet ist, verringert sich der Arbeitsspeicherbedarf auf vier Prozessoren, die jeweils 40 Seiten sortieren – also 160 (4 * 40) Seiten. Sie können die MAXDOP-Indexoption verwenden, um die Grade der Parallelität manuell zu reduzieren. Weitere Informationen finden Sie unter Konfigurieren von Parallelindexvorgänge.
Weitere Informationen darüber, wie SQL Server-Sortiervorgänge beim Erstellen von Indizes durchgeführt werden, finden Sie unter tempdb und Indexerstellung.