Transferir datos de forma eficaz con cambios de particiones

Las particiones de datos permiten administrar y tener acceso a subconjuntos de los datos de forma rápida y eficaz, a la vez que mantiene la integridad de toda la colección de datos. Puede usar la instrucción ALTER TABLE...SWITCH de Transact-SQL para transferir subconjuntos de datos rápida y eficazmente de las maneras siguientes:

  • Puede asignar una tabla como partición a una tabla con particiones existente.

  • Puede cambiar una partición de una tabla con particiones a otra.

  • Puede volver a asignar una partición para crear una sola tabla.

Para obtener información sobre los conceptos de conmutación de particiones, vea el ejemplo ReadMe_SlidingWindow. Para obtener información acerca de los ejemplos, vea Consideraciones para instalar ejemplos y bases de datos de ejemplo de SQL Server.

Requisitos generales para cambiar particiones

Cuando se transfiere una partición, los datos no se mueven físicamente; únicamente se modifican los metadatos que contienen información sobre la ubicación de los datos. Antes de poder conmutar particiones, se deben cumplir varios requisitos generales:

  • Ambas tablas deben existir antes de la operación SWITCH. Tanto la tabla de la que procede la partición (tabla de origen) como la tabla que la recibe (tabla de destino) deben existir en la base de datos antes de realizar la operación SWITCH.

  • La partición receptora debe existir y debe estar vacía. Tanto si agrega una tabla como partición a una tabla con particiones ya existente, como o si mueve una partición de una tabla con particiones a otra, la partición de que recibe la nueva partición debe existir y estar vacía.

  • La tabla sin particiones receptora debe existir y debe estar vacía. Si está reasignando una partición para crear una tabla sin particiones, la tabla que recibe la nueva partición debe existir y ser una tabla sin particiones vacía.

  • Las particiones deben estar definidas sobre la misma columna. Si para una partición de una tabla con particiones a otra, ambas tablas deben tener las particiones definidas sobre la misma columna.

  • Las tablas de origen y de destino deben compartir el mismo grupo de archivos. La tabla de origen y de destino de la instrucción ALTER TABLE...SWITCH deben encontrarse en el mismo grupo de archivos y sus columnas de valores voluminosos deben estar almacenadas en el mismo grupo de archivos. Los índices, particiones de índice o particiones de vista de índice correspondientes también deben encontrarse en el mismo grupo de archivos. Sin embargo, el grupo de archivos puede ser diferente del grupo de las tablas o los demás índices correspondientes.

Para obtener información sobre la conmutación de particiones al definir vistas indizadas, vea Conmutar particiones al definir vistas indizadas.

Requisitos de la estructura de tablas e índices

Además de los requisitos generales anteriores, tanto la tabla de origen como la tabla de destino deben tener la misma estructura. Los requisitos de estructura son los siguientes:

  • Las tablas de origen y de destino deben tener la misma estructura y orden de columnas. Las tablas deben tener las mismas columnas, con los mismos nombres y las mismas restricciones de tipo de datos, longitud, intercalación, precisión, escala, nulabilidad y PRIMARY KEY (si hubiera alguna), así como la misma configuración para ANSI_NULLS y QUOTED IDENTIFIER. Además, las columnas deben estar definidas en el mismo orden. La propiedad IDENTITY no se tiene en cuenta.

    Nota de advertenciaAdvertencia

    El cambio de particiones puede generar valores duplicados en las columnas IDENTITY de la tabla de destino y espacios en los valores de las columnas IDENTITY de la tabla de origen. Use DBCC CHECKIDENT para comprobar los valores de la identidad de las tablas y corregir los valores si así lo desea.

  • La nulabilidad de las columnas de particionamiento debe coincidir. Las tablas de destino y origen deben ser NULL o bien NOT NULL. Si una de las tablas no tiene particiones, la nulabilidad de la columna correspondiente a la columna de particionamiento de la otra tabla debe coincidir con la columna de la tabla con particiones.

    Nota importanteImportante

    Se recomienda especificar NOT NULL en la columna de particionamiento de las tablas con particiones. Se recomienda asimismo especificar NOT NULL en las tablas sin particiones que sean origen o destino para las operaciones ALTER TABLE...SWITCH. Cuando las columnas de partición sean NOT NULL, no se exige la comprobación de la existencia de valores nulos a ninguna de las restricciones CHECK definidas sobre las columnas de particionamiento. Los valores nulos se colocan normalmente en la partición situada más a la izquierda de una tabla con particiones. Al cambiar a cualquier partición distinta de la partición situada más a la izquierda y si la opción de base de datos ANSI_NULLS esté activada, la ausencia de la restricción NOT NULL en las tablas de origen y de destino puede interferir con cualquier restricción CHECK que también esté definida en la columna de particionamiento.

  • Las columnas calculadas deben tener la misma sintaxis. Si las claves de partición correspondientes son columnas calculadas, la sintaxis de las expresiones que definen las columnas calculadas debe ser la misma y ambas columnas calculadas deben ser persistentes.

  • Las propiedades ROWGUID deben ser iguales. Cualquier columna definida con la propiedad ROWGUID debe corresponderse con una columna de la otra tabla que esté también definida con la propiedad ROWGUID.

  • Las columnas XML deben tener el mismo esquema. Cualquier columna xml debe estar escrita en la misma colección de esquemas XML.

  • La configuración de almacenamiento consecutivo de cualquier columna de tipo text, ntext o image debe ser la misma. Para obtener más información acerca de esta configuración, vea Datos consecutivos.

  • Las tablas deben tener los mismos índices clúster. Ambas tablas de origen y de destino deben tener los mismos índices clúster, y los índices no pueden deshabilitarse antes de intercambiar las particiones.

  • Los índices no clúster deben estar definidos y ser idénticos. Todo índice no clúster definido en la tabla de destino también debe estar definido en la tabla de origen y tener una estructura idéntica en términos de unicidad, subclaves y dirección de ordenación (ASC o DESC) en cada columna de clave de índice. Los índices no clúster que están deshabilitados no necesitan satisfacer este requisito.

Requisitos de restricciones

Para mover particiones deben cumplirse los siguientes requisitos adicionales sobre restricciones:

  • Las restricciones CHECK deben coincidir exactamente o ser aplicables tanto a la tabla de origen como a la tabla de destino. Toda restricción CHECK definida en la tabla de destino deben estar también definida en la tabla de origen ya sea como una coincidencia exacta o como aplicable (por ejemplo, como un subconjunto) a las restricciones CHECK de la tabla de destino.

  • Las restricciones en columnas de tipo int deben ser las mismas o un subconjunto. Toda restricción CHECK sobre columnas int en la tabla de origen debe coincidir o existir como un subconjunto de restricciones en la columna int de la tabla de destino. Por ejemplo, si la tabla de destino tiene una restricción en una columna Column1 de tipo int que especifica Column1 < 100, la correspondiente columna Column1 de la tabla de origen debe contar con la misma restricción o bien con un subconjunto de la restricción sobre los valores de la tabla de destino, como por ejemplo Column1 < 90 de la tabla origen. Las restricciones CHECK que especifican varias columnas se deben definir utilizando la misma sintaxis.

  • Las tablas sin particiones deben tener las mismas restricciones que la partición de destino. Si agrega una tabla sin particiones como partición a una tabla con particiones ya existente, debe haber una restricción definida en la columna de la tabla de origen correspondiente a la clave de partición de la tabla de destino. Así se garantiza que el intervalo de valores se ajusta a los valores de límite de la partición de destino.

  • Los valores de límite de la partición de origen deben estar dentro del límite de la partición de destino. Si cambia una partición de una tabla con particiones a otra tabla con particiones, los valores de límite de la partición de origen deben ajustarse a los valores de límite de la partición de destino. Si no se ajustan, debe definirse una restricción en la clave de partición de la tabla de origen para garantizar que todos los datos de la tabla se ajustan a los valores de límite de la partición de destino.

    Nota de advertenciaAdvertencia

    Evite la conversión de tipos de datos en las definiciones de las restricciones. Las restricciones con conversiones implícitas o explícitas de tipos de datos definidas en las tablas que son origen de intercambio de particiones pueden provocar el error de ALTER TABLE...SWITCH.

  • Las tablas de origen y de destino deben tener las mismas restricciones FOREIGN KEY. Si la tabla de destino cuenta con restricciones FOREIGN KEY, la tabla de origen debe tener las mismas claves externas definidas en las columnas correspondientes; además, estas claves externas deben hacer referencia a la misma clave principal que las de la tabla de destino. Las claves externas de la tabla de origen no pueden estar marcadas como is_not_trusted (se puede ver en la vista de catálogo sys.foreign_keys), a menos que la clave externa correspondiente de la tabla de destino también esté marcada como is_not_trusted. Para obtener más información acerca de esta configuración, vea Directrices para deshabilitar índices. SQL Server aplica las reglas CASCADE definidas en las claves externas de la tabla de destino a la nueva partición desplazada.

Requisitos adicionales para mover particiones

Para mover particiones también deben cumplirse los siguientes requisitos adicionales:

  • Los índices deben estar alineados con las particiones de la tabla. Todo índice de la tabla de origen debe estar alineado con la tabla de origen, y todo índice de la tabla de destino debe estar alineado con la tabla de destino. Las tablas de origen y de destino pueden ambas tener particiones, ambas no tener particiones o bien tener particiones sólo una de ellas. Para obtener más información sobre la alineación de índices, vea Directrices especiales para índices con particiones.

  • Las restricciones y requisitos adicionales se aplican a las tablas de origen con vistas indizadas. Si la tabla de destino en la instrucción ALTER TABLE ... SWITCH tiene definida una vista indizada, vea Conmutar particiones al definir vistas indizadas para obtener información sobre restricciones y ejemplos.

  • No se permiten índices de texto completo. No pueden existir índices de texto completo en la tabla de origen ni en la de destino.

  • No se permiten índices XML en la tabla de destino. La tabla de destino no puede contener índices XML.

  • Ninguna clave principal/claves externas definidas si la tabla de origen contiene la clave principal. No puede existir una relación activa clave principal/clave externa entre la tabla de origen y la tabla de destino en donde la tabla de origen incluya la clave principal.

  • Ninguna clave principal/claves externas definidas si la tabla de destino tiene la clave externa. Si la tabla de destino incluye la clave externa, no puede existir una relación activa clave principal/clave externa entre la tabla de origen y la de destino.

  • Ninguna clave externa de otra tabla puede hacer referencia a la tabla de origen. No se puede hacer referencia a la tabla de origen desde ninguna clave externa perteneciente a otra tabla.

  • No se permiten reglas sobre las tablas de origen o de destino. No pueden existir reglas definidas en la tabla de origen ni en la de destino. Las restricciones CHECK se pueden usar en las tablas de origen y de destino.

    Nota

    Las reglas son una característica de compatibilidad con versiones anteriores. La implementación preferida es usar restricciones CHECK. Para conocer las limitaciones de CHECK, vea Requisitos de restricciones anteriormente en este tema.

  • Las tablas de origen y de destino no deben replicarse. Ni la tabla de origen ni la de destino pueden ser orígenes de una replicación.

  • Es preciso disponer de los permisos pertinentes sobre la base de datos antes del intercambio de particiones. Dado que al intercambiar una partición se usa una instrucción ALTER TABLE, se deben poseer los permisos de base de datos asociados a la instrucción ALTER TABLE. El conjunto de permisos no tiene que ser el mismo entre las tablas de origen y de destino.

  • Los desencadenadores no deben activarse durante la operación de movimiento de las particiones. Los desencadenadores de INSERT, UPDATE o DELETE ni las acciones en cascada no se activan al mover particiones de tabla, y no es necesario que las tablas de origen o de destino cuenten con desencadenadores definidos de forma similar para mover particiones.

    Nota

    Durante una operación ALTER TABLE…SWITCH, se obtiene un bloqueo de modificación de esquema en las tablas de origen y de destino para garantizar que ninguna otra conexión haga referencia a las tablas durante el cambio. Para obtener más información acerca de los bloqueos, vea Modos de bloqueo.

Para mover particiones de tabla