Particionar horizontalmente una tabla existente

Partición horizontal de tablas existentes en SQL Server

La partición de las tablas es una práctica que permite aumentar la eficiencia en el almacenamiento de la información cuando se trata de tablas grandes, si la tabla grande tiene muchos campos y algunos de estos ocupan mas espacio como los de imágenes, lo que se recomienda una partición vertical , por otro lado si la tabla tie nemuchos registros se recomienda una partición horizontal.

En este artículo se explica como particionar de manera horizontal una tabla ya creada para lo que vamos a crear una tabla de clientes y copiar los existentes en la tabla Customers de la base de datos Northwind. Al crear las tablas se puede particionar de manera horizontal (Ver partición Horizontal
de tablas
) o de manera Vertical (Ver partición vertical de tablas).

Particionando una tabla existente

Primero crear una base de datos con mas de un grupo de archivos, se recomienda el uso de varios discos. Para este ejemplo se ha trabajado solamente en la unidad C:
xp_create_subdir ‘C:\Datos\Revision’
go
Create database Particionando
on Primary
(name= ‘Parte01’, filename = ‘C:\Datos\Parte01.mdf’),
filegroup COMERCIAL
(name= ‘Comerc01’, filename = ‘C:\Datos\Revision\Comerc01.ndf’),
filegroup RECURSOS
(name= ‘Recu01’, filename = ‘C:\Datos\Recu01.ndf’),
filegroup CONTABLE
(name= ‘Contab01’, filename = ‘C:\Datos\Revision\Contab01.ndf’)
log on
(name= ‘Log101’, filename = ‘C:\Datos\Revision\Log101.ldf’)
go
Use Particionando
go

Crear la tabla clientes sin particionar.

Create table Clientes
(
ClientesCodigo nchar(5),
ClientesRazonSocial nvarchar(100) not null,
ClientesDireccion nvarchar(100),
ClientesPais nvarchar(50),
ClientesContacto nvarchar(100),
ClientesFechaRegistro Date,
ClientesTelefono nvarchar(30),
constraint ClientesPK primary key (ClientesCodigo)
)
go

Insertar los registros de la tabla Customers de Northwind

insert into Clientes
select C.CustomerID, C.CompanyName, C.Address, C.Country,
C.ContactName, GetDate(), C.Phone
from Northwind.dbo.Customers As C
go

Listar los datos de los clientes
select * from Clientes
go

En las propiedades de la tabla se puede notar que no está particionada.

Indicador de particionado en Falso

Para particionar la tabla se necesita crear una función de partición, un esquema de partición y luego eliminar el índice principal o Primary Key y luego crear el índice particionado.

Crear la función de partición
Create partition function ClientesFuncionParticion (nchar(5))
as range for values (‘E’,’J’,’P’,’U’)
go
Crear el esquema de partición
Create partition scheme ClientesEsquemaParticion
as partition ClientesFuncionParticion
to ([Primary], Contable, Recursos, Recursos, Comercial)
go

Para particionar la tabla existente se debe eliminar el indice de la PK, para esto se debe eliminar la restricción de tipo Primary key y crear un indice particionado
Alter table Clientes drop constraint ClientesPK
go
Crear el índice particionado en base al esquema ClientesEsquemaParticion
Create clustered index ClientesPK on Clientes(ClientesCodigo)
on ClientesEsquemaParticion(ClientesCodigo)
go

En las propiedades de la tabla se puede notar que ahora si está particionada.

Ver los clientes y la distribución de los mismas en las particiones

select C.ClientesCodigo, C.ClientesRazonSocial,
$Partition.ClientesFuncionParticion(ClientesCodigo) As ‘Partición’
from Clientes As C
go

La función $Partition muestra la partición a la que pertenece cada cliente.

Ver la distribución en las particiones

El Sript siguiente muestra la distribución de los registros en las diferentes particiones.

SELECT T.name As ‘Tabla’, i.name AS ‘Índice’,
P.partition_number As ‘Nº Partición’, R.value As ‘Límite’ ,
P.Rows As ‘Cantidad de Registros’
From sys.Tables As T
Join Sys.Indexes As I On T.object_id = I.object_id
— Relación de tablas con índices
Join sys.partitions As P On I.object_id = p.object_id And I.index_id = P.index_id
— Relación entre Particiones e Indices
Join sys.partition_schemes As S On I.data_space_id = S.data_space_id
— Relación entre Esquemas de partición e Indices
Join sys.partition_functions As F On S.function_id = F.function_id
— Relación entre Funciones de partición y Esquemas de partición
Left Join sys.partition_range_values As R On F.function_id = R.function_id and
R.boundary_id = P.partition_number
— Relación Rangos de particiones con funciones de partición
Where
T.name = ‘Clientes’ and I.type <= 1
Order By P.partition_number
go

Importante:
Las particiones de la tabla deberían estar en diferentes discos para optimizar las consultas.
En los grupos de archivos donde se han direccionado las particiones deberían tener mas de un archivo.
Los tamaños de los archivos donde se almacenan los datos de las tablas particionadas deberían ser grandes.