Índices particionados

Índices particionados

Los índices particionados son tipos de índices usados en tablas particionadas. (Ver Tablas particionadas).

Conceptos previos

  • La partición facilita el uso de tablas e índices grandes, ya que permite administrar  y tener acceso a subconjuntos de datos de forma rápida y eficaz, a la vez que mantiene la integridad de la recopilación de datos.
  • Si se utilizan las particiones, una operación como la carga de datos desde un  sistema OLTP a un sistema OLAP tarda solo unos segundos,  en lugar de los minutos y las horas que tardaba en versiones anteriores
    de SQL Server.
  • Las operaciones de mantenimiento que se realizan en los subconjuntos de datos  también se realizan de forma más eficaz porque estas operaciones solo afectan a los datos necesarios, en lugar de a toda la tabla.
  • Las tablas e índices con particiones únicamente están disponibles en las ediciones Enterprise, Developer y Evaluation de SQL Server.
  • Los datos de tablas e índices con particiones se dividen en unidades que pueden propagarse por más de un grupo de archivos de la base de datos.
  • Los datos se dividen en sentido horizontal, de forma que los grupos de filas se asignan a particiones individuales.
  • La tabla o el índice se tratarán como una sola entidad lógica cuando se realicen consultas o actualizaciones en los datos. Las particiones de un índice o una tabla deben encontrarse en la misma base de datos.
  • Las tablas y los índices con particiones admiten todas las propiedades y características asociadas con el diseño y la consulta de tablas e índices estándar, incluidas las restricciones, los valores predeterminados, los valores de identidad y marca de tiempo, así como los desencadenadores. Por tanto, si desea implementar una vista con particiones local en un servidor, puede interesarle implementar en su lugar una tabla con particiones.
  • La decisión acerca del uso de las particiones depende básicamente del tamaño actual  o futuro de la tabla, la forma en que se utiliza y el rendimiento que presenta en las consultas de usuario y las operaciones de mantenimiento.



Ejemplo

Para crear índices particionados vamos a crear primero una tabla particionada.
Este ejercicio muestra una tabla con 5 particiones en tres grupos de archivos,
la base de datos está creada en las unidades C: y D:

xp_create_subdir ‘C:\Parte’
go
xp_create_subdir ‘D:\Logica’
go
Create database Sistemas
on Primary (name= ‘Sistemas01’, Filename = ‘C:\Parte\Sistemas01.mdf’),
Filegroup VENTAS (name= ‘Sistemas02’, Filename = ‘C:\Parte\Sistemas02.ndf’),
Filegroup RECURSOS (name= ‘Sistemas03’, Filename = ‘C:\Parte\Sistemas03.ndf’)
log on
(name= ‘Tran01’, Filename = ‘C:\Parte\Tran01.ldf’)
go
use Sistemas
go

La tabla particionada, esta requiere una función de partición y un esquema
de partición.

Create partition function ProductosFP (nchar(10))
as range for values (‘E’,’J’, ‘O’, ‘T’)
go
Create partition scheme ProductosEP as partition ProductosFP
to (VENTAS, VENTAS, RECURSOS, [Primary], RECURSOS)
go
Create table Productos
(ProductosCodigo nchar(10), ProductosDescripcion nvarchar(100),
ProductosPrecio Numeric(9,2), ProductosStock Numeric(9,2)
constraint ProductosPK Primary key (ProductosCodigo))
on ProductosEP (ProductosCodigo)
go

Insertar datos a la tabla, se tomarán los datos de la tabla Products de Northwind

insert into Productos
select ProductID, ProductName, UnitPrice, UnitsInStock
from Northwind.dbo.Products
go

Generar un nuevo código
Primero mostrar el código.

select ProductosCodigo,
UPPER(left(ProductosDescripcion,4)+
Rtrim(Ltrim(iif(len(ProductosCodigo)=1,’000’+Ltrim(ProductosCodigo), ’00’+Ltrim(ProductosCodigo))))) + Rtrim(LTrim(‘PR’))
As ‘Nuevo Código’
from Productos
go

Recorrer los productos y actualizar los códigos.
Usaremos un cursor (Ver Cursores)

Declare cursorActualizaCodigos cursor for select * from Productos
Open cursorActualizaCodigos
Declare @Codigo nchar(10), @Descripcion nvarchar(100), @Precio Numeric(9,2), @Stock Numeric(9,2)
Fetch cursorActualizaCodigos into @Codigo , @Descripcion, @Precio , @Stock
While (@@FETCH_STATUS = 0)
Begin
Update Productos set ProductosCodigo =
UPPER(left(@Descripcion,4)+ Rtrim(Ltrim(iif(len(@Codigo)=1,’000’+Ltrim(@Codigo),
’00’+Ltrim(@Codigo))))) + Rtrim(LTrim(‘PR’))
where ProductosCodigo = @Codigo
Fetch cursorActualizaCodigos into @Codigo , @Descripcion, @Precio , @Stock
End
Close cursorActualizaCodigos
Deallocate cursorActualizaCodigos
go

Ver los datos y las particiones donde se guardaron

select ProductosCodigo, ProductosDescripcion,
$Partition.ProductosFP(ProductosCodigo) As ‘Partición’
from Productos
go

Índice particionado

Create index ProductosIDXParticionado on Productos (ProductosCodigo)
include (ProductosDescripcion)
on ProductosEP (ProductosCodigo)
go

Al final de la creación del índice se incluye la cláusula on seguido del nombre del esquema de partición y el campo particionado.

Note que para hacer mas eficiente el índice se puede incluir (usando include) el campo Descripción. (Ver Include en Índices)