Share via


Directrices para operaciones de índices en línea

Al realizar operaciones de índice en línea se aplican las siguientes directrices:

  • Los índices clúster deben crearse, recompilarse o quitarse sin conexión cuando la tabla subyacente contiene los siguientes tipos de datos de objetos grandes (LOB): image, ntext y text.

  • Los índices de tablas temporales locales no se pueden crear, reconstruir o quitar en línea. Esta restricción no se aplica a los índices de tablas temporales globales.

[!NOTA]

Las operaciones de índices en línea no están disponibles en todas las ediciones de Microsoft SQL Server. Para obtener una lista de características admitidas por las ediciones de SQL Server, vea Características compatibles con las ediciones de SQL Server 2012.

En la siguiente tabla se muestran operaciones de índice que se pueden llevar a cabo estando en línea y los índices que se excluyen de esas operaciones en línea. También se incluyen restricciones adicionales.

Operación de índice en línea

Índices excluidos

Otras restricciones

ALTER INDEX REBUILD

Índice clúster deshabilitado o vista indizada deshabilitada

Índice XML

Índice de una tabla temporal local

Si se especifica la palabra clave ALL la operación puede ser errónea si la tabla contiene un índice excluido.

Se aplican restricciones adicionales para reconstruir índices deshabilitados. Para obtener más información, vea Deshabilitar índices y restricciones.

CREATE INDEX

Índice XML

Índice clúster único inicial en una vista

Índice de una tabla temporal local

 

CREATE INDEX WITH DROP_EXISTING

Índice clúster deshabilitado o vista indizada deshabilitada

Índice de una tabla temporal local

Índice XML

 

DROP INDEX

Índice deshabilitado

Índice XML

Índice no clúster

Índice de una tabla temporal local

No se pueden especificar varios índices en una única instrucción.

ALTER TABLE ADD CONSTRAINT (PRIMARY KEY o UNIQUE)

Índice de una tabla temporal local

Índice clúster

Solo se permite una subcláusula cada vez. Por ejemplo, no puede agregar y quitar restricciones PRIMARY KEY o UNIQUE en la misma instrucción ALTER TABLE.

 

La tabla subyacente no se puede modificar, truncar o quitar mientras se está llevando a cabo una operación de índice en línea.

La configuración de opción en línea (ON u OFF) especificada al crear o quitar un índice clúster se aplica a índices no clúster que se deben reconstruir. Por ejemplo, si el índice clúster se genera en línea utilizando CREATE INDEX WITH DROP_EXISTING, ONLINE=ON, todos los índices no clúster asociados se vuelven a crear en línea también.

Cuando crea o reconstruye un índice UNIQUE en línea, el generador de índices y una transacción de usuario simultánea pueden intentar insertar la misma clave, infringiendo su unicidad. Si una fila especificada por un usuario se inserta en el nuevo índice (destino) antes de que la fila original de la tabla de origen se mueva al nuevo índice, se producirá un error en la operación de índice en línea.

Aunque no es común, la operación de índice en línea puede causar un interbloqueo cuando interactúa con las actualizaciones de la base de datos debido a las actividades de una aplicación o de un usuario. En esos casos poco comunes, el Motor de base de datos de SQL Server seleccionará el usuario o la actividad de la aplicación como sujeto de interbloqueo.

Solo puede realizar operaciones DDL de índice en línea simultáneas en la misma tabla o vista cuando crea varios índices no clúster o reorganiza índices no clúster. En todas las demás operaciones de índice en línea realizadas al mismo tiempo se produce un error. Por ejemplo, no puede crear un índice en línea mientras reconstruye un índice en línea existente en la misma tabla.

No se puede realizar una operación en línea cuando un índice contiene una columna del tipo de objetos grandes y en la misma transacción hay operaciones de actualización delante de esta operación en línea. Para solucionar temporalmente este problema, ponga la operación en línea fuera de la transacción o colóquela antes que cualquier actualización en la transacción.

Consideraciones acerca del espacio en disco

Normalmente, los requisitos de espacio en disco son los mismos para operaciones de índice en línea y sin conexión. Una excepción es el espacio en disco adicional que necesita el índice de asignación temporal. Este índice temporal se utiliza en operaciones de índice en línea que crean, reconstruyen o quitan un índice clúster. Para quitar un índice clúster en línea se requiere tanto espacio como para crearlo. Para obtener más información, vea Requisitos de espacio en disco para operaciones DDL de índice.

Consideraciones de rendimiento

Aunque las operaciones de índice en línea permiten actividades de actualización de usuario simultáneas, las operaciones de índice tardan más si la actividad de actualización es muy grande. Normalmente, las operaciones de índice en línea son más lentas que las operaciones de índice sin conexión equivalentes, independientemente del nivel de actividad de actualización simultánea.

Como las estructuras de origen y de destino se mantienen durante la operación de índice en línea, el uso de recursos para insertar, actualizar y eliminar transacciones aumenta, potencialmente hasta el doble. Esto puede provocar una reducción del rendimiento y un mayor uso de los recursos, especialmente de tiempo de CPU, durante la operación de índice. Las operaciones de índice en línea se registran totalmente.

Aunque se recomiendan las operaciones en línea, se debe evaluar el entorno y los requisitos específicos. Puede ser mejor ejecutar operaciones de índice sin conexión. Al hacerlo así, los usuarios tienen acceso restringido a los datos durante la operación, pero la operación acaba más rápido y utiliza menos recursos.

En equipos con varios procesadores que ejecutan SQL Server 2012, las instrucciones de índice pueden usar más procesadores para realizar el análisis y las operaciones de ordenación asociadas a la instrucción de índice, al igual que hacen otras consultas. Puede usar la opción de índice MAXDOP para controlar el número de procesadores dedicados a la operación de índice en línea. De este modo, puede equilibrar los recursos utilizados por la operación de índice con los de los usuarios simultáneos. Para obtener más información, vea Configurar operaciones de índice en paralelo. Para obtener más información sobre las ediciones de SQL que admiten operaciones indizadas en paralelo, vea Características compatibles con las ediciones de SQL Server 2012 (https://go.microsoft.com/fwlink/?linkid=232473).

Debido a que un bloqueo S o un bloqueo Sch-M se conservan en la fase final de la operación de índice, debe tener cuidado cuando ejecute una operación de índice en línea dentro de una transacción de usuario explícita, como el bloque BEGIN TRANSACTION...COMMIT. De esta manera el bloqueo se conserva hasta el final de la transacción y se impide la simultaneidad de usuarios.

Volver a generar el índice en línea puede aumentar la fragmentación cuando puede ejecutarse con las opciones MAX DOP > 1 y ALLOW_PAGE_LOCKS = OFF. Para obtener más información, vea Cómo funciona: Recompilación del índice en línea: puede provocar una fragmentación mayor.

Consideraciones del registro de transacciones

Las operaciones de índice a gran escala, realizadas sin conexión o en línea, pueden generar grandes cargas de datos que pueden hacer que el registro de transacciones se llene rápidamente. Para estar seguros de que la operación de índice se pueda revertir, el registro de transacciones no se puede truncar hasta que se haya completado la operación de índice; no obstante, se puede realizar una copia de seguridad del registro durante la operación de índice. Por lo tanto, el registro de transacciones debe tener suficiente espacio para almacenar las transacciones de la operación de índice y cualquier transacción de usuario simultánea durante la operación de índice. Para obtener más información, vea Espacio en disco del registro de transacciones para operaciones de índice.

Contenido relacionado

Cómo funcionan las operaciones de índice en línea

Realizar operaciones de índice en línea

ALTER INDEX (Transact-SQL)

CREATE INDEX (Transact-SQL)