En SQL Server, puede usar la ALTER PARTITION FUNCTION
para fusionar dos particiones en una partición.
Para hacer esto, use el MERGE RANGE
argumento, al tiempo que proporciona el valor límite de la partición que se va a descartar.
Esta operación elimina la partición y fusiona los valores que existen en la partición en una partición restante.
Ejemplo
Imagina que tenemos cinco particiones que queremos convertir en cuatro.
Particiones actuales
Tenemos una función de partición llamada MoviesPartitionFunction
con cuatro valores límite.
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';
Resultado:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 500 | | 4 | 10000 | +---------------+---------+
Esto significa que hay cinco particiones.
Para este ejemplo, descartaremos el rango límite 500.
Además, imagine que ya tenemos una tabla con datos distribuidos en algunas de estas particiones.
Así es como las filas se distribuyen actualmente en las particiones.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Resultado:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 400 | | 4 | 3579 | | 5 | 0 | +--------------------+-------------+
Debo señalar que Microsoft en realidad desaconseja fusionar (o dividir) particiones que contengan datos. Sin embargo, a los efectos de este ejemplo, dejaremos de lado las precauciones y fusionaremos dos particiones que contienen datos.
Fusionar las particiones
Bien, fusionemos particiones.
ALTER PARTITION FUNCTION MoviesPartitionFunction()
MERGE RANGE (500);
Resultado:
Commands completed successfully.
Fusionamos con éxito las particiones.
Comprueba el resultado
Comprobemos el resultado.
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';
Resultado:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 10000 | +---------------+---------+
Como era de esperar, el rango límite de 500 se eliminó y nos quedan solo tres rangos límite.
Veamos cómo se distribuyen los datos entre las particiones.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Resultado:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Nuevamente, como se esperaba, los datos de las particiones 3 y 4 se fusionaron en una partición (partición 3).
¿Por qué tener particiones vacías?
Si se pregunta por qué tengo particiones vacías en cada extremo, esto se hace específicamente para facilitar la división y fusión de particiones.
Mantener las particiones vacías en cada extremo evita cualquier movimiento de datos inesperado que pueda obtener al dividir o fusionar particiones.
Esta práctica también es recomendada por Microsoft, precisamente por esta razón.
Fusión de particiones que contienen datos
Como se mencionó, Microsoft recomienda no fusionar particiones que ya contienen datos.
Dividir o fusionar particiones pobladas puede ser ineficiente. Pueden ser ineficaces porque la división o la fusión pueden causar hasta cuatro veces más generación de registros y también pueden provocar bloqueos graves.