Usar vistas con particiones

Las vistas con particiones permiten repartir los datos de las tablas grandes en tablas miembro más pequeñas. Los datos se dividen entre las tablas miembro en función de los intervalos de valores de datos de una de las columnas. Los intervalos de datos de cada tabla miembro se definen en una restricción CHECK especificada en la columna que marca la partición. A continuación, se define una vista que usa UNION ALL para combinar las selecciones de todas las tablas miembro en un único conjunto de resultados. Cuando las instrucciones SELECT que hacen referencia a la vista especifican una condición de búsqueda en la columna de partición, el optimizador de consultas usa las definiciones de la restricción CHECK para determinar qué tabla miembro contiene las filas.

[!NOTA]

El método preferido para crear particiones de datos locales en un servidor es mediante tablas con particiones. Para obtener más información, vea Tablas e índices con particiones.

Por ejemplo, suponga que una tabla de ventas que registra las ventas de 1998 se ha dividido en 12 tablas miembro, una para cada mes. Cada tabla miembro tiene definida una restricción en la columna OrderMonth:

CREATE TABLE May1998sales
   (OrderID      INT,
   CustomerID      INT      NOT NULL,
   OrderDate      DATETIME      NULL
      CHECK (DATEPART(yy, OrderDate) = 1998),
   OrderMonth      INT
      CHECK (OrderMonth = 5),
   DeliveryDate      DATETIME      NULL
      CHECK(DATEPART(mm, DeliveryDate) = 5)
   CONSTRAINT OrderIDMonth PRIMARY KEY(OrderID, OrderMonth)
   )

La aplicación que rellena May1998sales debe asegurarse de que todas las filas tengan un 5 en la columna OrderMonth y que la fecha del pedido corresponda a una fecha de mayo de 1998. Esto se exige mediante las restricciones definidas en la tabla.

A continuación se define una vista que usa UNION ALL para seleccionar los datos de las 12 tablas miembro como un solo conjunto de resultados:

CREATE VIEW Year1998Sales
AS
SELECT * FROM Jan1998Sales
UNION ALL
SELECT * FROM Feb1998Sales
UNION ALL
SELECT * FROM Mar1998Sales
UNION ALL
SELECT * FROM Apr1998Sales
UNION ALL
SELECT * FROM May1998Sales
UNION ALL
SELECT * FROM Jun1998Sales
UNION ALL
SELECT * FROM Jul1998Sales
UNION ALL
SELECT * FROM Aug1998Sales
UNION ALL
SELECT * FROM Sep1998Sales
UNION ALL
SELECT * FROM Oct1998Sales
UNION ALL
SELECT * FROM Nov1998Sales
UNION ALL
SELECT * FROM Dec1998Sales

Por ejemplo, la siguiente instrucción SELECT consulta la información de determinados meses:

SELECT *
FROM Year1998Sales
WHERE OrderMonth IN (5,6) AND CustomerID = 64892

El optimizador de consultas de SQL Server reconoce que la condición de búsqueda de esta instrucción SELECT sólo hace referencia a filas de las tablas May1998Sales y Jun1998Sales. En consecuencia, limita la búsqueda a esas tablas.

Para realizar actualizaciones en una vista con particiones, la columna que marca la partición debe formar parte de la clave principal de la tabla base. Si no se actualiza una vista, puede crear un desencadenador INSTEAD OF en la vista que admite las actualizaciones. Debe diseñar un control de errores en el desencadenador para asegurarse de que no se inserten filas duplicadas. Para obtener un ejemplo de un desencadenador INSTEAD OF diseñado en una vista, vea Diseñar desencadenadores INSTEAD OF.

Las restricciones CHECK no son necesarias para que la vista con particiones devuelva resultados correctos. Sin embargo, si no se definen las restricciones CHECK, el optimizador de consultas debe buscar en todas las tablas, en lugar de sólo en aquellas que cubran la condición de búsqueda de la columna que marca la partición. Sin las restricciones CHECK, la vista funciona como cualquier otra vista con UNION ALL. El optimizador de consultas no puede realizar ninguna suposición acerca de los valores almacenados en las distintas tablas y no puede saltarse la búsqueda de las tablas que participan en la definición de la vista.

Si todas las tablas miembro a las que hace referencia una vista con particiones se encuentran en el mismo servidor, se trata de una vista con particiones local. Si las tablas miembro se encuentran en varios servidores, se trata de una vista con particiones distribuida. Las vistas con particiones distribuidas se pueden utilizar para repartir la carga de procesamiento de la base de datos de un sistema entre un grupo de servidores. Para obtener más información, vea Servidores de bases de datos federadas.

Las vistas con particiones simplifican el mantenimiento de cada una de las tablas miembro. Por ejemplo, al final de un período, puede realizar lo siguiente:

  • La definición de la vista con particiones de los resultados actuales se puede modificar a fin de que agregue el período más reciente y quite el más antiguo.

  • La definición de la vista con particiones de los resultados anteriores se puede modificar para que agregue el período recién quitado de la vista actual de resultados. La vista anterior de resultados también se puede actualizar de manera que quite y archive el período más antiguo que esté abarcando.

Cuando se insertan datos en las vistas con particiones, se puede utilizar el procedimiento almacenado del sistema sp_executesql para crear instrucciones INSERT con planes de ejecución que tengan una gran posibilidad de ser reutilizados en los sistemas con muchos usuarios simultáneos.

[!NOTA]

La importación masiva a una vista con particiones no es compatible con el comando bcp ni con las instrucciones BULK INSERT e INSERT ... SELECT * FROM OPENROWSET(BULK...). Sin embargo, puede insertar varias filas en una vista con particiones mediante una instrucción INSERT.