SQL Server 2014 CTP1 führt Erweiterungen für Online-Betriebsoptionen ein, die eine gute Nachricht für Unternehmen sind, die sehr große Datenbanken hosten, die wenig bis gar keine Ausfallzeiten erfordern.
Um den Kontext festzulegen, stellen Sie sich vor, dass Sie SQL Server 2012 Enterprise Edition für die Online-Indexverwaltung und Indexpartitionierungsfunktionen verwenden und versuchen, den folgenden Index für eine partitionierte Tabelle neu zu erstellen:
ALTER INDEX [PK_FactInternetSales_SalesOrderNumber_SalesOrderLineNumber] ON [dbo].[FactInternetSales] REBUILD PARTITION = ALL WITH (ONLINE= ON);
Wenn wir dies in SQL Server 2012 testen, können wir alle Partitionen fehlerfrei online neu erstellen. Aber was ist, wenn wir statt aller Partitionen eine bestimmte Partition angeben möchten?
ALTER INDEX [PK_FactInternetSales_SalesOrderNumber_SalesOrderLineNumber] ON [dbo].[FactInternetSales] REBUILD PARTITION = 1 WITH (ONLINE= ON);
Wenn Sie dies in SQL Server 2012 oder früher versuchen, wird die folgende Fehlermeldung angezeigt:
Msg 155, Level 15, State 1, Line 4'ONLINE' ist keine anerkannte Option ALTER INDEX REBUILD PARTITION.
Aber beginnend mit SQL Server 2014 (ab CTP1) werden nun Online-Einzelpartitions-Indexoperationen unterstützt. Und dies ist sicherlich eine große Sache für sehr große Tabellenwartungsszenarien, in denen Sie es vorziehen würden oder Ihre gesamte Wartung über einen bestimmten Zeitraum in kleinere Teile aufteilen müssen. Möglicherweise möchten Sie die Wartung auf Partitionsebene auch nur für die Partitionen durchführen, die dies tatsächlich erfordern – zum Beispiel für die Partitionen, die tatsächlich eine bestimmte Fragmentierungsstufe überschreiten.
Um diese CTP1-Funktionalität von SQL Server 2014 zu testen, habe ich AdventureWorksDW2012 mit einer Version von FactInternetSales verwendet, die 61.847.552 Zeilen enthält und nach der ShipDate-Spalte partitioniert ist.
Alle Partitionen für die Tabelle mit PARTITION = ALL
online neu aufbauen in meiner Testumgebung dauerte 3 Minuten und 23 Sekunden. In Bezug auf die Gesamtdauer betrafen meine Tests Indizes, die nicht allzu fragmentiert waren, sodass die Dauer von 3 Minuten und 23 Sekunden eine durchschnittliche Dauer über einige Tests darstellt. Denken Sie auch daran, dass zu diesem Zeitpunkt keine konkurrierenden Workloads ausgeführt wurden, sodass die Online-Neuerstellung erfolgt, ohne mit anderen signifikanten Workloads gegen den betreffenden Index konkurrieren zu müssen.
Die Form des Abfrageausführungsplans für die Onlineindexneuerstellung mit PARTITION = ALL
war wie folgt:
Ausführungsplan für die Online-Neuerstellung aller Partitionen
Beachten Sie, dass die Operationen mit Ausnahme des Constant Scan-Operators parallel aktiviert sind. Im Abfrageausführungsplan sehen Sie 39 Zeilen im Constant Scan der äußeren Referenz, die an den Distribute Streams-Operator übergeben werden und dann die verschachtelte Schleife steuern.
Die Bedeutung der 39 Zeilen? Die folgende Abfrage validiert die maximale Partitionsanzahl von sys.dm_db_partition_stats
. Für meine Testumgebung war das Ergebnis 39 für die maximale Partitionsnummer, was mit dem übereinstimmt, was ich für die tatsächlichen Zeilen des konstanten Scans gesehen habe:
SELECT MAX([partition_number]) AS [max_partition_number] FROM [sys].[dm_db_partition_stats] WHERE [object_id] = OBJECT_ID('FactInternetSales');
Jetzt werden Sie auch den Online Index Insert-Operator im vorherigen Plan bemerken. Entfernen des ONLINE = ON
Option aus meinem ALTER INDEX REBUILD
(wodurch es zu einer Offline-Operation wird) und PARTITION = ALL
beibehalten Option war die einzige Änderung, einen „Index Insert“-Operator anstelle eines „Online Index Insert“ im Abfrageausführungsplan zu haben – und auch eine Verkürzung der Dauer, wobei mein Test eine Ausführungsdauer von 1 Minute und 9 Sekunden im Vergleich zum Online zeigte 3 Minuten und 23 Sekunden.
Ich habe dann stattdessen eine Online-Neuerstellung einer Partition mit 5.678.080 Zeilen darin getestet (denken Sie daran, dass die Gesamtzahl der Tabellenzeilen 61.847.552 Zeilen beträgt). Für diesen Test dauerte die Gesamtdauer genau 1 Minute und hatte die folgende Form des Abfrageausführungsplans:
Ausführungsplan für die Online-Neuerstellung einer einzelnen Partition
Die erste Beobachtung ist, dass dies ein serieller Plan ist. Beachten Sie auch, dass ich gesagt habe, dass ich eine Partition aus den ursprünglichen 39 ausgewählt habe, obwohl diese bestimmte Partition insgesamt ~ 9% der Zeilen in der Tabelle darstellt. Beachten Sie auch, dass der Constant Scan 1 Zeile statt 39 anzeigt, wie ich erwarten würde.
Was ist mit der Dauer einer einzelnen Partition, Offline-Wiederherstellung? In meiner Testumgebung dauerte dies 11 Sekunden im Vergleich zum Online-Neuaufbau 1 Minute. Die Form des Abfrageausführungsplans für die Offline-Neuerstellung einer einzelnen Partition lautete wie folgt:
Ausführungsplan für die Offline-Neuerstellung einer einzelnen Partition
Beachten Sie, dass es keinen Constant Scan- oder zugehörigen Nested Loops-Prozess gibt, und beachten Sie auch, dass dieser Plan jetzt parallele Operatoren im Vergleich zum vorherigen seriellen Plan enthält, obwohl beide einen Clustered Index Scan für 5.678.080 Zeilen durchführen. Auch eine Schlüsselwortsuche nach „Partition“ im XML-Plantext für die parallele Offline-Indexoperation für einzelne Partitionen ergab keine Übereinstimmungen – im Vergleich zum seriellen Plan, Online-Einzelpartitionsindexoperation, bei der Partitioned =„true“ für die hatte Clustered Index Scan und Online Index Insert Physische Operatoren.
Zurück zur Haupterkundung …
Kann ich einige, aber nicht alle Partitionen in einer einzigen Ausführung auswählen? Leider nicht.
Der ALTER INDEX
und ALTER TABLE
Befehle haben den PARTITION = ALL
Argument und dann PARTITION = <partition number>
-Argument, aber nicht die Möglichkeit, mehrere Partitionen für einen einzigen Neuerstellungsvorgang aufzulisten. Ich beschwere mich jedoch nicht zu laut darüber, da ich froh bin, eine einzelne Partition online neu erstellen zu können, und es nicht sehr kompliziert ist, den Vorgang einmal für jeden Neuaufbau auszuführen, aber die kumulative Auswirkung auf die Dauer war etwas Ich wollte weiter forschen.
Wie lange würde es dauern, alle 39 Partitionen separat und online im Vergleich zu PARTITION = ALL
neu zu erstellen? Dauer von 3 Minuten und 23 Sekunden?
Wir wissen, dass ein Vorteil von Online-Neuaufbauten darin besteht, dass während des Indexvorgangs weiterhin auf die zugehörige Tabelle oder den Index zugegriffen werden kann. Aber im Gegenzug für diesen Online-Vorgang verlieren wir den Leistungsvorteil der Neuerstellung im Vergleich zu einer Offline-Neuerstellung. Als Nächstes wollte ich wissen, wie sich eine Online-Wiederherstellung einer Einzelpartition im Vergleich zu PARTITION = ALL
verhalten würde Alternative.
Bei der Ausführung von 39 separaten Wiederherstellungsvorgängen (eine Wiederherstellung für jede eindeutige Partition) betrug die Gesamtausführungsdauer 9 Minuten und 54 Sekunden im Vergleich zu PARTITION = ALL
was 3 Minuten und 23 Sekunden dauerte, also ist der stückweise Ansatz kumulativ nicht so schnell wie eine Online-Wiederherstellung aller Partitionen in einer Anweisung. Während ich eine Partition nach der anderen erstellen konnte, ist der übergeordnete Vorteil die Möglichkeit, unsere Wartungsaktivitäten im Laufe der Zeit aufzuteilen und den Zugriff auf die Objekte zu behalten, während sie neu erstellt werden, aber wenn Sie nach einer kürzeren Neuerstellung suchen Fenster sind Offline-Optionen immer noch am schnellsten, gefolgt von Online für PARTITION = ALL
und dann an letzter Stelle eine Partition nach der anderen.
Die folgende Tabelle fasst die Dauervergleiche zusammen – und auch diese Tests basierten auf SQL Server 2014 CTP1 und einer sehr spezifischen Tabellengröße und VM-Gastkonfiguration, achten Sie also mehr auf die relative Dauer der Tests als auf die Dauer selbst:
Testbeschreibung | Dauer |
---|---|
Offline-Neuaufbau aller Partitionen | 1:09 |
Online-Neuaufbau aller Partitionen | 3:23 |
Online-Neuaufbau einer Partition | 1:00 |
Offline-Neuaufbau einer Partition | 0:11 |
Online-Neuaufbau aller Partitionen, Partition für Partition | 9:54 |
Nun gibt es noch weitere Aspekte zu diesem Thema zu erforschen. Nur weil eine Operation online ist, heißt das nicht, dass es nicht ein paar Momente (oder länger) gibt, in denen das Zielobjekt noch gesperrt ist. Indexoperationen haben immer noch ein Sperrverhalten für Onlineoperationen – und SQL Server 2014 hat auch dafür Optionen bereitgestellt, die ich in einem separaten Beitrag untersuchen werde.