In SQL Server kunt u de ALTER PARTITION FUNCTION
. gebruiken om twee partities samen te voegen tot één partitie.
Gebruik hiervoor het MERGE RANGE
argument, terwijl de grenswaarde van de te laten vallen partitie wordt opgegeven.
Met deze bewerking wordt de partitie verwijderd en worden alle waarden die in de partitie bestaan, samengevoegd tot een resterende partitie.
Voorbeeld
Stel je voor dat we vijf partities hebben waarvan we er vier willen worden.
Huidige partities
We hebben een partitiefunctie genaamd MoviesPartitionFunction
met vier grenswaarden.
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';
Resultaat:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 500 | | 4 | 10000 | +---------------+---------+
Dit betekent dat er vijf partities zijn.
Voor dit voorbeeld laten we het grensbereik van 500 vallen.
Stel je ook voor dat we al een tabel hebben met gegevens die over sommige van deze partities zijn verdeeld.
Hier ziet u hoe de rijen momenteel over de partities zijn verdeeld.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Resultaat:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 400 | | 4 | 3579 | | 5 | 0 | +--------------------+-------------+
Ik moet erop wijzen dat Microsoft eigenlijk afraadt om partities die gegevens bevatten samen te voegen (of te splitsen). Voor het doel van dit voorbeeld zullen we echter voorzichtig zijn en twee partities samenvoegen die gegevens bevatten.
De partities samenvoegen
OK, laten we partities samenvoegen.
ALTER PARTITION FUNCTION MoviesPartitionFunction()
MERGE RANGE (500);
Resultaat:
Commands completed successfully.
We hebben de partities succesvol samengevoegd.
Controleer het resultaat
Laten we het resultaat eens bekijken.
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';
Resultaat:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 10000 | +---------------+---------+
Zoals verwacht is het grensbereik van 500 weggelaten en blijven er nog maar drie grensbereiken over.
Laten we eens kijken hoe de gegevens over de partities zijn verdeeld.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Resultaat:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Zoals verwacht zijn de gegevens van partities 3 en 4 samengevoegd tot één partitie (partitie 3).
Waarom lege partities?
Als je je afvraagt waarom ik aan elk uiteinde lege partities heb, is dit specifiek gedaan om het splitsen en samenvoegen van partities te vergemakkelijken.
Door partities aan elk uiteinde leeg te houden, voorkomt u onverwachte gegevensverplaatsing die u kunt krijgen bij het splitsen of samenvoegen van partities.
Precies om deze reden wordt deze praktijk ook aanbevolen door Microsoft.
Partities samenvoegen die gegevens bevatten
Zoals vermeld raadt Microsoft af om partities samen te voegen die al gegevens bevatten.
Het splitsen of samenvoegen van bevolkte partities kan inefficiënt zijn. Ze kunnen inefficiënt zijn omdat het splitsen of samenvoegen tot wel vier keer meer loggeneratie kan veroorzaken, en ook ernstige vergrendeling kan veroorzaken.