In SQL Server können Sie die ALTER PARTITION FUNCTION
verwenden um zwei Partitionen zu einer Partition zusammenzuführen.
Verwenden Sie dazu den MERGE RANGE
-Argument, während der Grenzwert der zu löschenden Partition bereitgestellt wird.
Dieser Vorgang löscht die Partition und führt alle Werte, die in der Partition vorhanden sind, in einer verbleibenden Partition zusammen.
Beispiel
Stellen Sie sich vor, wir haben fünf Partitionen, die wir zu vier machen möchten.
Aktuelle Partitionen
Wir haben eine Partitionsfunktion namens MoviesPartitionFunction
mit vier Grenzwerten.
SELECT
prv.boundary_id,
prv.[value]
FROM sys.partition_range_values prv
INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
WHERE pf.name = 'MoviesPartitionFunction';
Ergebnis:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 500 | | 4 | 10000 | +---------------+---------+
Das bedeutet, dass es fünf Partitionen gibt.
In diesem Beispiel lassen wir den Grenzbereich 500 fallen.
Stellen Sie sich außerdem vor, wir haben bereits eine Tabelle mit Daten, die über einige dieser Partitionen verteilt sind.
So sind die Zeilen derzeit über die Partitionen verteilt.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Ergebnis:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 400 | | 4 | 3579 | | 5 | 0 | +--------------------+-------------+
Ich sollte darauf hinweisen, dass Microsoft eigentlich davon abrät, Partitionen, die Daten enthalten, zusammenzuführen (oder aufzuteilen). Für dieses Beispiel lassen wir jedoch Vorsicht walten und führen zwei Partitionen zusammen, die Daten enthalten.
Partitionen zusammenführen
OK, lassen Sie uns Partitionen zusammenführen.
ALTER PARTITION FUNCTION MoviesPartitionFunction()
MERGE RANGE (500);
Ergebnis:
Commands completed successfully.
Wir haben die Partitionen erfolgreich zusammengeführt.
Überprüfen Sie das Ergebnis
Sehen wir uns das Ergebnis an.
SELECT
prv.boundary_id,
prv.[value]
FROM sys.partition_range_values prv
INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
WHERE pf.name = 'MoviesPartitionFunction';
Ergebnis:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 10000 | +---------------+---------+
Wie erwartet wurde der Grenzbereich von 500 gestrichen, und wir haben nur noch drei Grenzbereiche.
Sehen wir uns an, wie die Daten auf die Partitionen verteilt werden.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Ergebnis:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Wie erwartet wurden die Daten der Partitionen 3 und 4 zu einer Partition (Partition 3) zusammengeführt.
Warum leere Partitionen?
Falls Sie sich fragen, warum ich an jedem Ende leere Partitionen habe, dies geschieht speziell, um das Teilen und Zusammenführen von Partitionen zu erleichtern.
Das Leerhalten von Partitionen an jedem Ende verhindert unerwartete Datenverschiebungen, die beim Teilen oder Zusammenführen von Partitionen auftreten können.
Genau aus diesem Grund wird diese Vorgehensweise auch von Microsoft empfohlen.
Partitionen zusammenführen, die Daten enthalten
Wie bereits erwähnt, rät Microsoft davon ab, Partitionen zusammenzuführen, die bereits Daten enthalten.
Das Aufteilen oder Zusammenführen von bestückten Partitionen kann ineffizient sein. Sie können ineffizient sein, da das Aufteilen oder Zusammenführen bis zu viermal mehr Protokollgenerierung verursachen und auch schwerwiegende Sperren verursachen kann.