Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Aufteilen einer Partition in zwei in SQL Server (T-SQL)

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.