Una de las tareas más deseadas hoy en día por muchos administradores de bases de datos, es el particionar sus tablas, una de las grandes ventajas del particionamiento de tablas en SQL Server, es la capacidad de distribuir la carga física en múltiples discos duros, por ende, existen más partes mecánicas ejecutando una sola tarea.
Sin embargo, gran parte de estas bases de datos existen desde hace mucho tiempo, por lo que no se encuentran particionadas en su gran mayoría, además de estar soportando actualmente aplicaciones de negocio, debido a esto, no es posible realizar un rediseño en donde las tablas puedan ser eliminadas y reconstruidas.

Tabla Original

 
CREATE TABLE Clientes
(id int identity(1,1),
Nombre varchar(100),
Apellido varchar(100))

Datos de prueba

 
id          Nombre            Apellido
----------- ---------------- ------------------------------------
1           John              Bocachica
2           Juliana           Salcedo
3           Pilar             Villate
4           Valentina         Villavicencio
 
(4 row(s) affected)
 

Verificación de los datos en las particiones

 
Select partition_number, rows from sys.partitions
where object_id = object_id('Clientes')
 
partition_number rows
---------------- --------------------
1                2
 
(1 row(s) affected)
 

Proceso para particionar la tabla existente

El proceso realmente es sencillo, consiste en crear un índice particionado tipo cluster sobre la tabla, de esta forma los datos se mueven a sus respectivas particiones.

Paso 1  - Crear los filegroups y los datafiles

USE [master]
GO
ALTER DATABASE [TEST] ADD FILEGROUP [SECUNDARIO]
GO
ALTER DATABASE [TEST] ADD FILE ( NAME = N'OTROARCHIVODEDATOS', FILENAME = N'F:\DATA\OTROARCHIVODEDATOS.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [SECUNDARIO]
GO

Paso 2 – Crear la función de particionamiento

CREATE PARTITION FUNCTION FuncionDemo(int)
AS RANGE LEFT FOR VALUES (2)

Paso 3 – Crear el esquema de particionamiento

CREATE PARTITION SCHEME EsquemaDemo
AS PARTITION FuncionDemo
TO ([PRIMARY], SECUNDARIO)
 

Paso 4 – Verificar si el índice existe, si su tabla ya cuenta con el índice, vaya al paso 6, de lo contrario, vaya al paso 5

Paso 5 – Crear el índice asociado al esquema

CREATE CLUSTERED INDEX IndiceParaParticionar
ON Clientes
(
      ID asc
)
ON EsquemaDemo(id)

Paso 6 – Crear el índice asociado al esquema eliminando el existente

CREATE CLUSTERED INDEX IndiceParaParticionar
ON Clientes
(
      ID asc
) WITH (DROP_EXISTING = ON)
ON EsquemaDemo(id)
 
Ahora puede verificar que los datos estén particionados, nuevamente puede ejecutar el link de Verificación de los datos en las particiones
partition_number rows
---------------- --------------------
1                2
2                2
 
(2 row(s) affected)

De igual manera se puede verificar directo en la tabla.

 
SELECT * FROM Clientes
WHERE $PARTITION.FuncionDemo(ID) = 1;
 
id          Nombre       Apellido
----------- ------------ ------------------------------------
1           John         Bocachica
2           Juliana      Salcedo
 
(2 row(s) affected)
 
SELECT * FROM Clientes
WHERE $PARTITION.FuncionDemo(ID) = 2;
 
id          Nombre       Apellido
----------- ------------ ------------------------------------
3           Pilar        Villate
4           Valentina    Villavicencio
 
(2 row(s) affected)