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

Zusammenführen von zwei Partitionen zu einer in SQL Server (T-SQL)

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.