I SQL Server kan du bruge ALTER PARTITION FUNCTION
at flette to partitioner til én partition.
For at gøre dette skal du bruge MERGE RANGE
argument, mens den angiver grænseværdien for den partition, der skal falde.
Denne operation sletter partitionen og flette alle værdier, der findes i partitionen, til en resterende partition.
Eksempel
Forestil dig, at vi har fem partitioner, som vi ønsker at blive til fire.
Nuværende partitioner
Vi har en partitionsfunktion kaldet MoviesPartitionFunction
med fire grænseværdier.
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';
Resultat:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 500 | | 4 | 10000 | +---------------+---------+
Det betyder, at der er fem partitioner.
I dette eksempel dropper vi grænseområdet 500.
Forestil dig også, at vi allerede har en tabel med data fordelt på nogle af disse partitioner.
Her er, hvordan rækkerne i øjeblikket er fordelt på tværs af partitionerne.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Resultat:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 400 | | 4 | 3579 | | 5 | 0 | +--------------------+-------------+
Jeg skal påpege, at Microsoft faktisk fraråder at flette (eller opdele) partitioner, der indeholder data. Men med henblik på dette eksempel vil vi kaste forsigtighed til vinden og flette to partitioner, der indeholder data.
Flet partitionerne
OK, lad os flette partitioner.
ALTER PARTITION FUNCTION MoviesPartitionFunction()
MERGE RANGE (500);
Resultat:
Commands completed successfully.
Vi har flettet partitionerne sammen.
Tjek resultatet
Lad os tjekke resultatet.
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';
Resultat:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 10000 | +---------------+---------+
Som forventet er grænseområdet på 500 blevet droppet, og vi står tilbage med kun tre grænseområder.
Lad os se, hvordan dataene er fordelt på tværs af partitionerne.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Resultat:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Igen som forventet er dataene fra partition 3 og 4 slået sammen til én partition (partition 3).
Hvorfor have tomme partitioner?
Hvis du undrer dig over, hvorfor jeg har tomme partitioner i hver ende, gøres dette specifikt for at lette opdeling og sammenlægning af partitioner.
At holde partitioner tomme i hver ende forhindrer enhver uventet databevægelse, du måtte få, når du opdeler eller flette partitioner.
Denne praksis anbefales også af Microsoft, netop af denne grund.
Fletter partitioner, der indeholder data
Som nævnt fraråder Microsoft at flette partitioner, der allerede indeholder data.
Opdeling eller sammenlægning af befolkede partitioner kan være ineffektivt. De kan være ineffektive, fordi opdelingen eller fletningen kan forårsage så meget som fire gange mere loggenerering og kan også forårsage alvorlig låsning.