V SQL Server můžete použít ALTER PARTITION FUNCTION
sloučit dva oddíly do jednoho oddílu.
K tomu použijte MERGE RANGE
argument a zároveň poskytuje hraniční hodnotu oddílu, který má být zrušen.
Tato operace zruší oddíl a sloučí všechny hodnoty, které v oddílu existují, do zbývajícího oddílu.
Příklad
Představte si, že máme pět oddílů, ze kterých se chceme stát čtyřmi.
Aktuální oddíly
Máme funkci oddílu s názvem MoviesPartitionFunction
se čtyřmi hraničními hodnotami.
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';
Výsledek:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 500 | | 4 | 10000 | +---------------+---------+
To znamená, že existuje pět oddílů.
V tomto příkladu zrušíme hraniční rozsah 500.
Představte si také, že již máme tabulku s daty distribuovanými přes některé z těchto oddílů.
Zde je návod, jak jsou řádky aktuálně rozděleny mezi oddíly.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Výsledek:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 400 | | 4 | 3579 | | 5 | 0 | +--------------------+-------------+
Měl bych zdůraznit, že Microsoft ve skutečnosti nedoporučuje slučovat (nebo rozdělovat) oddíly, které obsahují data. Pro účely tohoto příkladu však zahodíme opatrnost a sloučíme dva oddíly, které obsahují data.
Sloučit oddíly
OK, pojďme sloučit oddíly.
ALTER PARTITION FUNCTION MoviesPartitionFunction()
MERGE RANGE (500);
Výsledek:
Commands completed successfully.
Úspěšně jsme sloučili oddíly.
Zkontrolujte výsledek
Pojďme zkontrolovat výsledek.
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';
Výsledek:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 10000 | +---------------+---------+
Jak se očekávalo, hraniční rozsah 500 byl vypuštěn a zbývají nám pouze tři hraniční rozsahy.
Podívejme se, jak jsou data distribuována mezi oddíly.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Výsledek:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Opět podle očekávání se data z oddílů 3 a 4 sloučila do jednoho oddílu (oddíl 3).
Proč mít oddíly prázdné?
Pokud vás zajímá, proč mám na každém konci prázdné oddíly, je to speciálně provedeno pro usnadnění rozdělování a slučování oddílů.
Ponechání prázdných oddílů na obou koncích zabrání jakémukoli neočekávanému přesunu dat, ke kterému může dojít při rozdělování nebo slučování oddílů.
Tento postup je také doporučován společností Microsoft, a to právě z tohoto důvodu.
Sloučení oddílů, které obsahují data
Jak již bylo zmíněno, Microsoft nedoporučuje slučovat oddíly, které již obsahují data.
Rozdělení nebo sloučení obsazených oddílů může být neefektivní. Mohou být neefektivní, protože rozdělení nebo sloučení může způsobit až čtyřikrát více generování protokolu a může také způsobit vážné zamykání.