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

Dividir una partición en dos en SQL Server (T-SQL)

Si tiene una tabla o un índice particionado en SQL Server, pero necesita más particiones, puede agregar una partición a la función de partición usando ALTER PARTITION FUNCTION declaración con el SPLIT RANGE argumento.

Cuando haces esto, divides una partición existente en dos.

Ejemplo

Aquí hay un ejemplo para demostrar. Primero, veamos nuestra configuración actual.

Configuración actual

Ya tenemos cuatro particiones y queremos agregar una quinta.

Así que ya hemos creado una función de partición como esta:

CREATE PARTITION FUNCTION MoviesPartitionFunction (int)  
    AS RANGE LEFT FOR VALUES (-1, 100, 10000);

Este código da como resultado particiones que almacenan valores de la siguiente manera.

Partición Valores
1 <=–1
2 > –1 Y <=100
3 > 100 Y <=10000
4 > 10000

Para este ejemplo, agregaremos un nuevo valor límite de 500.

Así que queremos que se vea así:

Partición Valores
1 <=–1
2 > –1 Y <=100
3 > 100 Y <=500
4 > 500 Y <=10000
5 > 10000

Además, a los efectos de este ejemplo, imagina que tenemos una tabla que se particiona con la función de partición anterior y que actualmente contiene poco más de cuatro mil filas de datos.

Echemos un vistazo rápido a cómo se distribuyen las filas en nuestras 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           |
+--------------------+-------------+

Ahora queremos agregar una nueva partición con un valor de límite de 500.

En este caso, dividiremos la partición entre los valores límite 100 y 10000.

Debo mencionar que Microsoft recomienda no dividir particiones pobladas. Así que eso es algo a tener en cuenta.

Sin embargo, a los efectos de este ejemplo, dividiremos una partición que contiene datos.

Dividir la partición

Aquí es donde continuamos y dividimos la partición.

Usamos la ALTER PARTITION FUNCTION instrucción para dividir la partición.

Sin embargo, dividir una partición crea dos particiones de una, por lo que debemos asegurarnos de que haya un grupo de archivos para la nueva partición. También debemos asegurarnos de que nuestro esquema de partición sepa qué grupo de archivos usar cuando dividimos la partición.

Puede usar un grupo de archivos existente o puede crear uno nuevo.

Vamos a crear uno nuevo.

Aquí está el código que podemos usar para hacer todo lo anterior:

ALTER DATABASE Test ADD FILEGROUP MoviesFg5;

ALTER DATABASE Test   
ADD FILE   
(  
    NAME = MoviesFg5dat,  
    FILENAME = '/var/opt/mssql/data/MoviesFg5dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB  
)  
TO FILEGROUP MoviesFg5;

ALTER PARTITION SCHEME MoviesPartitionScheme  
NEXT USED MoviesFg5;

ALTER PARTITION FUNCTION MoviesPartitionFunction()
SPLIT RANGE (500);

Resultado:

Commands completed successfully.

Hemos dividido con éxito la partición.

Verificar la división

Ahora podemos verificar que la función de partición se ha modificado para reflejar los nuevos 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   |
+---------------+---------+

Entonces podemos ver que el nuevo valor límite se ha agregado con éxito.

Y así es como los datos ahora se distribuyen 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                  | 400         |
| 4                  | 3579        |
| 5                  | 0           |
+--------------------+-------------+

Así que ahora tenemos 5 particiones.

¿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.

Dividir particiones que contienen datos

Como se mencionó, Microsoft recomienda no dividir 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.