Nota
O acceso a esta páxina require autorización. Pode tentar iniciar sesión ou modificar os directorios.
O acceso a esta páxina require autorización. Pode tentar modificar os directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia
administrada de Azure SQLBase de datos SQL en Microsoft Fabric
Al realizar operaciones de índice en línea se aplican las siguientes directrices:
Los índices agrupados deben crearse, volver a compilarse o quitarse sin conexión cuando la tabla subyacente contienen los siguientes tipos de datos de objetos grandes (LOB): image, ntexty text.
Los índices no clúster no agrupados se pueden crear en línea cuando la tabla tiene columnas con los tipos de datos LOB, pero ninguna de estas columnas se usa en la definición de índice como columnas de clave o incluidas.
Los índices de tablas temporales locales no se pueden crear, reconstruir ni descartar en línea. Esta restricción no se aplica a los índices de tablas temporales globales.
Puede iniciar una operación de índice en línea como una operación reanudable mediante la
RESUMABLEcláusula CREATE INDEX o ALTER INDEX. Una operación de índice reanudable puede reiniciarse después de un error inesperado, una conmutación por error de base de datos o unALTER INDEX PAUSEcomando y continuar desde donde se interrumpió.
Note
Las operaciones de índices en línea no están disponibles en todas las ediciones de Microsoft SQL Server. Para obtener una lista de las características admitidas por las ediciones de SQL Server, consulte Ediciones y características admitidas de SQL Server 2022.
En la siguiente tabla se muestran operaciones de índice que se pueden llevar a cabo estando en línea, los índices que se excluyen de esas operaciones en línea y restricciones de índice reanudables. 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 desactivado Í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 agrupado |
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. |
ALTER TABLE DROP CONSTRAINT (PRIMARY KEY o UNIQUE) |
Índice agrupado |
La tabla subyacente no se puede modificar, truncar ni quitar mientras una operación de índice en línea está en curso.
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 agrupado se compila en línea mediante CREATE INDEX WITH DROP_EXISTING, ONLINE = ON, todos los índices no clúster asociados también se vuelven a crear en línea.
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 estos casos poco frecuentes, el usuario o la actividad de la aplicación se selecciona como víctima del interbloqueo.
Solo puede realizar operaciones DDL de índice en línea simultáneas en la misma tabla o vista cuando crea varios índices no agrupado 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 nuevo 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 objeto grande y la misma transacción realiza modificaciones de datos antes de que se inicie la operación de índice en línea. Para solucionar este problema, mueva la operación de índice en línea fuera de la transacción o muévala antes de cualquier modificación de datos en la misma transacción.
Consideraciones acerca del espacio en disco
Las operaciones de índice en línea requieren más espacio en disco que las operaciones de índice sin conexión.
Durante las operaciones de creación y regeneración de índices, se requiere espacio adicional para el índice que se crea o regenera. Normalmente, este espacio adicional es el mismo que el espacio actual ocupado por el índice, pero podría ser mayor o menor en función de la compresión usada en el índice actual o recompilado.
Además, se requiere espacio en disco para 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 agrupado en línea se requiere tanto espacio como para crearlo o regenerarlo.
Para más información, consulte Requisitos de espacio en disco para operaciones DDL de índice.
Consideraciones sobre el rendimiento
Aunque las operaciones de índice en línea permiten la actividad simultánea de actualización de usuarios, las operaciones de índice pueden tardar más si la actividad de actualización es pesada. 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.
Dado que las estructuras de origen y destino se mantienen durante la operación de índice en línea, el uso de recursos para las transacciones de inserción, actualización y eliminación se aumenta, lo que podría duplicarse. 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 multiprocesador que ejecutan SQL Server 2016 (13.x) y versiones posteriores, las operaciones de índice pueden usar paralelismo para realizar las operaciones de análisis y ordenación asociadas a la instrucción de índice. Puede usar la MAXDOP opción de índice para controlar el grado de paralelismo de la operación de índice en línea. De este modo, puede equilibrar los recursos utilizados por la operación de índice con los recursos de los usuarios simultáneos. Para obtener más información, consulte Configuración de operaciones de índice en paralelo. Para obtener más información sobre las ediciones de SQL que admiten operaciones indexadas en paralelo, consulte Ediciones y características admitidas de SQL Server 2022.
Dado que un bloqueo compartido (S) o un bloqueo de modificación de esquema (Sch-M) se mantiene hasta la fase final de la operación de índice, tenga cuidado al realizar una operación de índice en línea dentro de una transacción de usuario explícita, como el bloque BEGIN TRANSACTION ... COMMIT. Esto hace que los bloqueos se mantengan hasta el final de la transacción, lo que podría bloquear otras cargas de trabajo.
Si los bloqueos de página de índice están deshabilitados mediante ALLOW_PAGE_LOCKS = OFF, la reconstrucción de índices en línea puede aumentar la fragmentación del índice cuando se ejecuta con MAXDOP mayor que 1. Para obtener más información, vea el blog How It Works: Online Index Rebuild - Can Cause Increased Fragmentation(Cómo la regeneración de índices 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 cantidades de registro de transacciones. Esto se debe a que las operaciones de recompilación de índices sin conexión y en línea están totalmente registradas. Para estar seguros de que la operación de índice se pueda revertir, el registro de transacciones no se puede truncar hasta que se complete 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 más información, consulte Espacio en disco del registro de transacciones para operaciones de índice.
Las operaciones de índice en línea no provocan un crecimiento elevado del registro de transacciones si está habilitada la recuperación acelerada de bases de datos (ADR).
Consideraciones sobre el almacenamiento de versiones persistente
Si ADR está habilitado, crear o regenerar un índice grande en línea puede aumentar considerablemente el tamaño del almacén de versiones persistentes (PVS) mientras la operación de índice está en curso. Asegúrese de que la base de datos tiene suficiente espacio libre para que PVS crezca. Para obtener más información, consulte Supervisión y solución de problemas de recuperación acelerada de bases de datos.
Consideraciones sobre índices reanudables
La RESUMABLE opción de índice para CREATE INDEX y ALTER INDEX se aplica a SQL Server (ALTER INDEX a partir de SQL Server 2017 (14.x) y CREATE INDEX a partir de SQL Server 2019 (15.x)), Azure SQL Database e Instancia administrada de Azure SQL. Para obtener más información, vea CREATE INDEX y ALTER INDEX.
Para usar la RESUMABLE opción , también debe usar la ONLINE opción . Al realizar la creación o recompilación de índices reanudables, se aplican las siguientes directrices:
Tiene un mejor control sobre la administración, el planeamiento y la extensión de las ventanas de mantenimiento de índices. Puede pausar y reiniciar una operación de recompilación o creación de índice varias veces para que se ajuste a los períodos de mantenimiento.
Puede recuperarse de errores de creación o recompilación de índices (como conmutaciones por error de base de datos o quedarse sin espacio en disco) sin tener que reiniciar la operación de índice desde el principio.
Cuando una operación de índice está en pausa, tanto el índice original como el recién creado requieren espacio en disco y deben actualizarse durante las operaciones de DML.
La opción
SORT_IN_TEMPDB = ONno se admite.No se admiten índices deshabilitados.
Tip
Las operaciones de índice reanudables no requieren una transacción grande, lo que permite el truncamiento frecuente del registro durante esta operación y evita el crecimiento grande del registro. Los datos necesarios para reanudar y completar una operación de índice se almacenan en los archivos de datos de una base de datos.
Por lo general, no hay ninguna diferencia de rendimiento entre las operaciones de índice en línea reanudables y no recuperables. Para la funcionalidad de CREATE INDEX que permite reanudación, hay una sobrecarga constante que puede provocar que las operaciones sean visiblemente más lentas para tablas más pequeñas.
Cuando se pausa una operación de índice reanudable:
- En la mayoría de las cargas de trabajo de lectura, la degradación del rendimiento es insignificante.
- En el caso de las cargas de trabajo de actualización intensivas, es posible que experimente alguna degradación del rendimiento en función de los detalles de la carga de trabajo.
Por lo general, no hay ninguna diferencia en la calidad de desfragmentación entre la recompilación o la creación de índices en línea reanudables y no reanudables.
Mientras se pausa una operación de índice en línea, se produce un error en cualquier transacción que requiera un bloqueo exclusivo de nivel de tabla (X) en la tabla que contiene el índice en pausa. Por ejemplo, esto puede producirse durante INSERT ... WITH (TABLOCK) operaciones. En este caso, obtendrá el error 10637:
Cannot perform this operation on '<object name>' with ID (<object ID>) as one or more indexes are currently in resumable index rebuild state. Please refer to sys.index_resumable_operations for more details.
Para resolver el error 10637, quite la sugerencia TABLOCK de la transacción o reanude la operación del índice y espere a que se complete antes de volver a intentar la transacción.
Opciones predeterminadas en línea
Puede establecer operaciones de índice en línea y reanudables como opciones predeterminadas en el nivel de base de datos configurando las opciones ELEVATE_ONLINE o ELEVATE_RESUMABLE en las configuraciones de ámbito de base de datos. Con estas opciones predeterminadas, puede evitar iniciar accidentalmente una operación de índice sin conexión que hace que una tabla o índice sea inaccesible mientras se ejecuta. Ambas opciones hacen que el motor de base de datos eleva automáticamente determinadas operaciones de índice a la ejecución en línea o reanudable.
Puede establecer cualquiera de las opciones como FAIL_UNSUPPORTED, WHEN_SUPPORTEDo OFF. Puede establecer valores diferentes para ELEVATE_ONLINE y ELEVATE_RESUMABLE. Para obtener más información, vea ALTER DATABASE SCOPED CONFIGURATION.
ELEVATE_ONLINE y ELEVATE_RESUMABLE solo se aplican a las instrucciones de DDL que admiten la sintaxis de ONLINE y RESUMABLE, respectivamente. Por ejemplo, si intenta crear un índice XML con ELEVATE_ONLINE = FAIL_UNSUPPORTED, la operación se ejecuta sin conexión, ya que los índices XML no admiten la ONLINE opción . Las opciones solo afectan a las instrucciones DDL que se envían sin especificar ninguna opción ONLINE o RESUMABLE. Por ejemplo, si se envía una instrucción con ONLINE = OFF o RESUMABLE = OFF, el usuario puede invalidar un valor de configuración FAIL_UNSUPPORTED y ejecutar una instrucción sin conexión o no reanudable.
Note
ELEVATE_ONLINE y ELEVATE_RESUMABLE no se aplican a las operaciones de índice XML.