Wenn Sie eine partitionierte Tabelle oder einen partitionierten Index in SQL Server haben, aber mehr Partitionen benötigen, können Sie der Partitionsfunktion mithilfe der ALTER PARTITION FUNCTION
eine Partition hinzufügen Anweisung mit dem SPLIT RANGE
Argument.
Wenn Sie dies tun, teilen Sie eine vorhandene Partition in zwei Teile auf.
Beispiel
Hier ist ein Beispiel zur Veranschaulichung. Sehen wir uns zunächst unsere aktuelle Einrichtung an.
Aktuelle Einrichtung
Wir haben bereits vier Partitionen und möchten eine fünfte hinzufügen.
Wir haben also bereits eine Partitionsfunktion wie diese erstellt:
CREATE PARTITION FUNCTION MoviesPartitionFunction (int)
AS RANGE LEFT FOR VALUES (-1, 100, 10000);
Dieser Code führt zu Partitionen, die Werte wie folgt speichern.
Partition | Werte |
---|---|
1 | <=–1 |
2 | > –1 UND <=100 |
3 | > 100 UND <=10000 |
4 | > 10000 |
Für dieses Beispiel fügen wir einen neuen Grenzwert von 500 hinzu.
Wir wollen also, dass es so aussieht:
Partition | Werte |
---|---|
1 | <=–1 |
2 | > –1 UND <=100 |
3 | > 100 UND <=500 |
4 | > 500 UND <=10000 |
5 | > 10000 |
Stellen Sie sich für dieses Beispiel außerdem vor, dass wir eine Tabelle haben, die mit der obigen Partitionsfunktion partitioniert ist und derzeit etwas mehr als viertausend Datenzeilen enthält.
Werfen wir einen kurzen Blick darauf, wie die Zeilen auf unsere Partitionen verteilt sind:
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 | +--------------------+-------------+
Also wollen wir jetzt eine neue Partition mit einem Grenzwert von 500 hinzufügen.
In diesem Fall teilen wir die Partition zwischen den Grenzwerten 100 und 10000 auf.
Ich sollte erwähnen, dass Microsoft davon abrät, bevölkerte Partitionen aufzuteilen. Das ist also etwas, das man im Hinterkopf behalten sollte.
Für dieses Beispiel teilen wir jedoch eine Partition, die Daten enthält.
Teilen Sie die Partition auf
Hier gehen wir vor und teilen die Partition auf.
Wir verwenden die ALTER PARTITION FUNCTION
Anweisung zum Aufteilen der Partition.
Durch das Teilen einer Partition werden jedoch zwei Partitionen aus einer erstellt, und daher müssen wir sicherstellen, dass es eine Dateigruppe für die neue Partition gibt. Wir müssen auch sicherstellen, dass unser Partitionsschema weiß, welche Dateigruppe verwendet werden soll, wenn wir die Partition aufteilen.
Sie können eine vorhandene Dateigruppe verwenden oder eine neue erstellen.
Lassen Sie uns eine neue erstellen.
Hier ist der Code, den wir verwenden können, um all dies zu tun:
ALTER DATABASE Test ADD FILEGROUP MoviesFg5;
ALTER DATABASE Test
ADD FILE
(
NAME = MoviesFg5dat,
FILENAME = '/var/opt/mssql/data/MoviesFg5dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP MoviesFg5;
ALTER PARTITION SCHEME MoviesPartitionScheme
NEXT USED MoviesFg5;
ALTER PARTITION FUNCTION MoviesPartitionFunction()
SPLIT RANGE (500);
Ergebnis:
Commands completed successfully.
Wir haben die Partition erfolgreich geteilt.
Überprüfen Sie die Teilung
Wir können jetzt überprüfen, ob die Partitionsfunktion modifiziert wurde, um die neuen Grenzwerte widerzuspiegeln.
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 | +---------------+---------+
So können wir sehen, dass der neue Grenzwert erfolgreich hinzugefügt wurde.
Und so werden die Daten jetzt auf 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 | +--------------------+-------------+
Also haben wir jetzt 5 Partitionen.
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.
Teilen von Partitionen, die Daten enthalten
Wie bereits erwähnt, rät Microsoft davon ab, Partitionen aufzuteilen, 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.