Partición horizontal de tablas existentes en SQL Server

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, una tabla grande puede tener muchos campos, lo que se recomienda una partición vertical o puede tener muchos registros por lo que se recomienda una partición horizontal.

En este artículo se explica como particionar una tabla existente en SQL Server para lo que vamos a crear una tabla de clientes y copiar los registros existentes en la tabla Customers de la base de datos Northwind.



Primero: Base de datos con grupos

xp_create_subdir ‘C:\Datos\Revision’
go
Create database Particionando
on Primary
(name= ‘Part01’, filename = ‘C:\Datos\Part01.mdf’),
filegroup COMERCIAL
(name= ‘Comer01’, filename = ‘C:\Datos\Revision\Comer01.ndf’),
filegroup RECURSOS
(name= ‘Rec01’, filename = ‘C:\Datos\Rec01.ndf’),
filegroup CONTABLE
(name= ‘Conta01’, filename = ‘C:\Datos\Revision\Conta01.ndf’)
log on
(name= ‘Log01’, filename = ‘C:\Datos\Revision\Log01.ldf’)
go
Use Particionando
go

Creamos la tabla de Clientes (Ver Creación de tablas)

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 datos (Ver Insert)

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

Crear la función de partición (Ver Tablas particionadas horizontalmente)

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 índice agrupado, este se ha creado al incluir la restricción Primary key PK, para esto se debe eliminar la restricción de tipo Primary key y crear un indice particionado. (Ver índices particionados)

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
Al visualizar la estructura de la tabla se puede ver el índice particionado en el esquema de partición llamado ClientesEsquemaParticion.
sp_help Clientes
go

Para visualizar los clientes y la distribución de los mismas en las particiones se utiliza la siguiente instrucción:

select C.ClientesCodigo, C.ClientesRazonSocial,
$Partition.ClientesFuncionParticion(ClientesCodigo) As ‘Partición’
from Clientes As C
go
Note que se ha resaltado en la imagen el número de la partición donde se han almacenado los registros de la tabla Clientes.



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