sql >> Base de Datos >  >> RDS >> Sqlserver

Combinar dos particiones en una en SQL Server (T-SQL)

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.