Particionamiento de Tablas de Bases de Datos en SQL Server
Particionamiento de Tablas de Bases de Datos en SQL Server
Particionamiento de Tablas de Bases de Datos en SQL Server
https://www.sqlshack.com/es/particionamiento-de-tablas-de-bases-de-datos-en-sql-server/ 1/15
14/7/2021 Particionamiento de tablas de bases de datos en SQL Server
Si corremos una consulta SQL para recuperar los datos de ReportID, ReportName, ReportNumber de
la tabla EmployeeReports el resultado establece que la cuenta del escaneo es 5 y representa un nú‐
mero de veces que la tabla ha sido accedida durante la consulta, y que teníamos 113288 lecturas lógi‐
cas que representan el número total de accesos de páginas para procesar la consulta:
https://www.sqlshack.com/es/particionamiento-de-tablas-de-bases-de-datos-en-sql-server/ 2/15
14/7/2021 Particionamiento de tablas de bases de datos en SQL Server
SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT er.ReportID, er.ReportName, er.ReportNumber
FROM dbo.EmployeeReports er
WHERE er.ReportNumber LIKE '%33%'
SET STATISTICS IO OFF
SET STATISTICS TIME OFF
Como se indicó, cada página es leída desde el caché de datos, sea o no necesario traer la página
desde el disco al caché para cualquier lectura dada. Para reducir el costo de la consulta cambiaremos
el esquema de base de datos de SQL Server y dividiremos la tabla EmployeeReports verticalmente.
https://www.sqlshack.com/es/particionamiento-de-tablas-de-bases-de-datos-en-sql-server/ 3/15
14/7/2021 Particionamiento de tablas de bases de datos en SQL Server
SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT er.ReportID, er.ReportName, er.ReportNumber
FROM ReportsData er
WHERE er.ReportNumber LIKE '%33%'
SET STATISTICS IO OFF
SET STATISTICS TIME OFF
La partición vertical en tablas SQL Server puede no ser el método correcto en cada caso. Sin embargo,
si usted tiene, por ejemplo, una tabla con muchos datos que no se accede igualitariamente, tablas con
datos a los que desea restringir el acceso, o escaneos que retornan muchos datos, la partición vertical
puede ayudar.
Las tablas son particionadas horizontalmente basadas en una columna que será usada para particionar
y los rangos asociados a cada partición. La columna de particionamiento es usualmente una columna
de fecha pero todos los tipos de datos que son válidos para usarse como columnas de índice pueden
ser usados como columna de partición excepto columnas timestamp Los siguientes tipos de datos no
https://www.sqlshack.com/es/particionamiento-de-tablas-de-bases-de-datos-en-sql-server/ 4/15
14/7/2021 Particionamiento de tablas de bases de datos en SQL Server
ser usados como columna de partición, excepto columnas timestamp. Los siguientes tipos de datos no
pueden ser especificados: ntext, text, image, xml, varchar(max), nvarchar(max), o varbinary(max), el
tipo definido por el usuario Microsoft .NET Framework common language runtime (CLR), columnas de
tipo de datos de alias.
Hay dos enfoques diferentes que podríamos usar para lograr la partición de la tabla. El primero es
crear una nueva tabla particionada y simplemente copiar los datos desde su tabla existente en la
nueva tabla y renombrarla. El segundo enfoque es particionar una tabla existente reconstruyendo o
creando un índice agrupado en la tabla.
Para crear una tabla particionada para almacenar reportes mensuales primero crearemos grupos de
archivos adicionales. Un grupo de archivos es una unidad de almacenamiento lógica. Cada base de
datos tiene un grupo de archivos que contiene el archivo de datos primario (.mdf). Un grupo de archi‐
vos adicional y definido por el usuario puede ser creado para contener archivos secundarios (.ndf).
Nosotros crearemos 12 grupos de archivos por cada mes:
Para verificar los grupos de archivos creados y disponibles en la base de datos actual ejecute la si‐
guiente consulta:
Cuando son creados grupos de archivos añadiremos el archivo .ndf a cada grupo de archivos:
ALTER DATABASE [PartitioningDB]
ADD FILE
(
NAME = [PartJan],
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.LENOVO\MSSQL\DATA\P
artitioningDB.ndf',
SIZE = 3072 KB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 1024 KB
) TO FILEGROUP [January]
De la misma manera los archivos a todos los grupos de archivos creados especificando el nombre ló‐
gico del archivo y el nombre del archivo del sistema operativo (físico) para cada grupo de archivos.
Por ejemplo:
Para verificar archivos creado añadidos a los grupos de archivos ejecute la siguiente consulta:
SELECT
name as [FileName],
physical_name as [FilePath]
FROM sys.database_files
where type_desc = 'ROWS'
GO
Después de crear grupos de archivos adicionales para almacenar datos crearemos una función de par‐
tición. Una función de partición es una función que mapea las filas de una tabla particionada en parti‐
ciones basada en los valores de una columna de partición. En este ejemplo crearemos una función de
partición que particiona una tabla en 12 particiones, una por cada mes de los valores de un año en
una columna de fecha:
Para mapear las particiones de una tabla particionada a grupos de archivos y determinar el número y
dominio de las particiones de una tabla crearemos un esquema de partición:
Ahora vamos a crear la tabla usando el esquema de partición PartitionBymonth, y la llenaremos con
datos de prueba:
SELECT
p.partition_number AS PartitionNumber,
f.name AS PartitionFilegroup,
p.rows AS NumberOfRows
FROM sys.partitions p
JOIN sys.destination_data_spaces dds ON p.partition_number = dds.destination_id
JOIN sys.filegroups f ON dds.data_space_id = f.data_space_id
WHERE OBJECT_NAME(OBJECT_ID) = 'Reports'
Ahora simplemente copie los datos desde su tabla y renombre una tabla particionada.
https://www.sqlshack.com/es/particionamiento-de-tablas-de-bases-de-datos-en-sql-server/ 8/15
14/7/2021 Particionamiento de tablas de bases de datos en SQL Server
Haga clic derecho en una tabla en el panel Object Explorer y en el menú contextual Storage elija el
comando Create Partition:
En la ventana Select a Partitioning Column, seleccione una columna que será usada para particionar
una tabla desde las columnas de partición disponibles:
https://www.sqlshack.com/es/particionamiento-de-tablas-de-bases-de-datos-en-sql-server/ 9/15
14/7/2021 Particionamiento de tablas de bases de datos en SQL Server
Otras opciones en el diálogo Create Partition Wizard incluyen la opción Collocate this table to the
selected partition table, usada para mostrar datos relacionados para unirlos con la columna particio‐
nada y la opción Storage Align Non Unique Indexes and Unique Indexes with an Indexed Parti‐
tion Column, que alinea todos los índices de la tabla particionada con el mismo esquema de
partición.
Después de seleccionar una columna para particionar haga clic en el botón Next. En la ventana Select
a Partition Function ingrese el nombre de una función de partición para mapear las filas de la tabla o
índice en particiones basadas en los valores de la columna ReportDate, o seleccione la función de par‐
tición existente:
Haga clic en el botón Next y en la ventana Select a Partition Scheme cree el esquema de partición
para mapear las particiones de la tabla MonthlyReport a diferentes grupos de archivos:
https://www.sqlshack.com/es/particionamiento-de-tablas-de-bases-de-datos-en-sql-server/ 10/15
14/7/2021 Particionamiento de tablas de bases de datos en SQL Server
Haga clic en el botón Next y en la ventana Map Partitions elija el rango de particionamiento y selec‐
cione los grupos de archivos disponibles y los límites del rango. El límite izquierdo está basado en Va‐
lor <= Límite y el límite derecho está basado en Valor < Límite.
Haciendo clic en el botón Set boundaries usted puede personalizar el rango de datos y establecer las
fechas de inicio y final para cada partición:
https://www.sqlshack.com/es/particionamiento-de-tablas-de-bases-de-datos-en-sql-server/ 11/15
14/7/2021 Particionamiento de tablas de bases de datos en SQL Server
La opción Estimate storage determina las columnas Rowcont, Required (espacio requerido) y Availa‐
ble (espacio disponible), que muestran un estimado acerca del espacio requerido y el espacio disponi‐
ble basado en el número de registros en la tabla.
La siguiente pantalla del asistente ofrece elegir la opción para ejecutar el script inmediatamente por el
asistente para crear objetos y una tabla de partición, o crear un script y grabarlo. Un horario para eje‐
cutar el script para realizar las operaciones automáticamente puede ser también especificado:
La siguiente pantalla del asistente muestra una revisión de las selecciones hechas en el asistente:
https://www.sqlshack.com/es/particionamiento-de-tablas-de-bases-de-datos-en-sql-server/ 12/15
14/7/2021 Particionamiento de tablas de bases de datos en SQL Server
Recursos útiles
Partitioning
Partitioned Tables and Indexes
Files and Filegroups Architecture
https://www.sqlshack.com/es/particionamiento-de-tablas-de-bases-de-datos-en-sql-server/ 13/15