Directrices para realizar operaciones de índice en línea
Al realizar operaciones de índice en línea se aplican las siguientes directrices:
Los índices agrupados deben estar sin conexión para crearse, reconstruirse o quitarse cuando la tabla subyacente contenga tipos de datos de objetos grandes (LOB): image, ntext, text, varchar(max), nvarchar(max), varbinary(max) y xml.
Los índices no agrupados que no son únicos se pueden crear en línea cuando la tabla contiene tipos de datos LOB, pero ninguna de estas columnas se utiliza en la definición del índice como columna de clave o sin clave (incluida). Los índices no agrupados definidos con las columnas de tipos de datos LOB se deben crear o reconstruir sin conexión.
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 únicamente están disponibles en las ediciones Enterprise, Developer y Evaluation de SQL Server.
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 agrupado 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 Directrices para deshabilitar índices. |
CREATE INDEX |
Índice XML Índice agrupado único inicial en una vista Índice de una tabla temporal local |
|
CREATE INDEX WITH DROP_EXISTING |
Índice agrupado deshabilitado o vista indizada deshabilitada Índice de una tabla temporal local Índice XML |
|
DROP INDEX |
Índice deshabilitado Índice XML Índice no agrupado Í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 agrupado |
Sólo 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. |
ALTER TABLE DROP CONSTRAINT (PRIMARY KEY o UNIQUE) |
Índice agrupado |
|
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 agrupados 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 agrupados 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 SQL Server Database Engine (Motor de base de datos de SQL Server) seleccionará el usuario o la actividad de la aplicación como sujeto de interbloqueo.
Sólo puede realizar operaciones DDL de índice en línea simultáneas en la misma tabla o vista cuando crea varios índices no agrupados o reorganiza índices no agrupados. Se producirá un error en todas las operaciones de índice en línea que se realizan al mismo momento. Por ejemplo, no puede crear un índice en línea mientras reconstruye un índice en línea existente en la misma tabla.
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 los equipos con varios procesadores que ejecutan SQL Server Enterprise, las instrucciones sobre índices pueden utilizar más procesadores para realizar las operaciones de examen y ordenación asociadas a dicha instrucción, al igual que hacen otras consultas. Puede utilizar 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.
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.
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.
Vea también