Compartir a través de


Funcionamiento de las operaciones de índice en línea

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLBase de datos SQL en Microsoft Fabric

En este artículo se definen las estructuras que existen durante una operación de índice en línea y se muestran las actividades asociadas a estas estructuras.

Estructuras de índice en línea

Para permitir la actividad simultánea de los usuarios durante una operación de lenguaje de definición de datos de índice (DDL), se utilizan las siguientes estructuras durante la operación de índice en línea: índices de origen y preexistentes, índice de destino, y para reconstruir un montón o eliminar un índice agrupado de forma online, se utiliza un índice de asignación temporal.

  • Índices de origen y preexistentes

    El origen es la tabla original o los datos del índice clúster. Los índices preexistentes son cualquier índice no clúster asociado a la estructura de origen. Por ejemplo, si la operación de índice en línea vuelve a generar un índice agrupado que tiene cuatro índices no clúster asociados, el origen es el índice agrupado existente y los índices preexistentes son los índices no clúster.

    Los índices preexistentes están disponibles para los usuarios simultáneos para las operaciones de selección, inserción, actualización y eliminación. Esto incluye inserciones masivas (admitidas pero no recomendadas durante una operación de índice en línea) y actualizaciones implícitas por desencadenadores y restricciones de integridad referencial. Todos los índices preexistentes están disponibles para las consultas. Esto significa que podrían ser seleccionados por el optimizador de consultas y, si es necesario, especificarse en sugerencias de índice.

  • Target

    Los destinos son el nuevo índice (o montón) o un conjunto de nuevos índices que se crean o se regeneran. El motor de base de datos aplica las operaciones de inserción, actualización y eliminación del usuario desde el origen hacia el destino durante la operación de indexación. Por ejemplo, si la operación de índice en línea vuelve a generar un índice agrupado, el destino es el índice agrupado recompilado; El motor de base de datos no vuelve a generar índices no agrupados cuando se vuelve a generar un índice agrupado.

    El índice de destino no se usa hasta que se confirma la operación de índice. Internamente, el índice está marcado como de solo escritura.

  • Índice de asignación temporal

    Las operaciones de índice en línea que crean, quitan o regeneran un índice clúster también precisan un índice de asignación temporal. Las transacciones simultáneas usan este índice temporal para determinar qué registros eliminar en los nuevos índices que se están compilando cuando se actualizan o eliminan las filas de la tabla de origen. Este índice no clúster se crea en el mismo paso que el nuevo índice agrupado (o montón) y no requiere una operación de ordenación independiente. Las transacciones simultáneas mantienen el índice de asignación temporal en todas sus operaciones de inserción, actualización y eliminación.

Actividades de índice en línea

Durante una operación de índice en línea, como crear un índice agrupado en una tabla no indexada (montón), el origen y el destino pasan por tres fases: preparación, compilación y final.

Puede utilizar el evento extendido progress_report_online_index_operation para supervisar el progreso de una operación de índice en línea.

En la ilustración siguiente se muestra el proceso para crear un índice clúster inicial en línea. El objeto de origen (el montón) no dispone de otros índices. Las actividades de estructura de origen y destino se muestran para cada fase; También se muestran las operaciones simultáneas de usuario SELECT, INSERT, UPDATE, y DELETE . Las fases de preparación, generación y final se indican con los modos de bloqueo empleados en cada una de ellas.

Diagrama que muestra las actividades realizadas durante la operación de índice en línea.

Actividades de estructura de fuente

En la tabla siguiente se muestran las actividades relacionadas con las estructuras de origen durante cada fase de la operación de índice y la estrategia de bloqueo correspondiente.

Phase Actividad de origen Bloqueos de origen
Preparation

Fase corta
Preparación de los metadatos del sistema para crear la nueva estructura de índice vacía.

Se define una instantánea de base de datos. Es decir, se utilizan las versiones de fila para proporcionar coherencia de lectura en la transacción.

Las operaciones de usuario simultáneas de escritura se bloquean durante un período breve.

No se admiten las operaciones DDL simultáneas, excepto la creación de varios índices no clúster.
Compartido (S) en la tabla1

Intención compartida (IS)

Bloqueo de objeto de modificación de esquema (Sch-M) con el recurso de subtipo INDEX_OPERATION2
Build

Fase principal
Los datos se examinan, ordenan, combinan e insertan en el destino mediante operaciones de carga masiva.

Las operaciones simultáneas de usuario INSERT, UPDATE, DELETEy MERGE se aplican a los índices preexistentes y a los índices nuevos que se compilan.
Intención compartida (IS)

Sch-M bloqueo de objeto con el subtipo 2 de recurso INDEX_OPERATION
Final

Fase corta
Todas las transacciones de escritura no confirmadas deben completarse antes de que se inicie esta fase. Dependiendo del bloqueo adquirido, todas las transacciones de lectura o escritura del nuevo usuario se bloquean durante un breve período hasta que se complete esta fase.

Se actualizan los metadatos del sistema para reemplazar el origen con el destino.

El origen se quita si es necesario, por ejemplo, después de volver a generar o quitar un índice agrupado.
Sch-M bloqueo de objeto con el subtipo 2 de recurso INDEX_OPERATION

Compartido (S) en la tabla si crea un índice no clúster.1

Sch-M si se quita cualquier estructura de origen (índice o tabla). 1

1 La operación de índice espera a que se completen las transacciones de escritura no confirmadas antes de adquirir el bloqueo S o el bloqueo Sch-M en la tabla. Si se realiza una consulta de larga duración, la operación de índice en línea espera hasta que finaliza la consulta. A menos que se usen bloqueos de prioridad baja, esto podría formar una cadena de bloqueo.

2 Un Sch-M bloqueo de objeto con el subtipo INDEX_OPERATION de recurso impide la ejecución de operaciones simultáneas del lenguaje de definición de datos (DDL) en las estructuras de origen y preexistentes mientras la operación de índice está en curso. Por ejemplo, este bloqueo impide la regeneración simultánea de dos índices en la misma tabla. Aunque se trata de un Sch-M bloqueo, no impide instrucciones de manipulación de datos.

En la tabla anterior se muestra un único bloqueo compartido (S) adquirido durante la fase de compilación de una operación de índice en línea que implica un único índice. Cuando se compilan índices agrupados y no agrupados, o se vuelven a generar, en una única operación de índice en línea (por ejemplo, durante la creación inicial de índices agrupados en una tabla que contiene uno o varios índices no agrupados), se adquieren dos bloqueos a corto plazo durante la fase de compilación seguida de bloqueos compartidos de intenciones a largo plazo S (IS). Primero se adquiere un S bloqueo para la creación del índice agrupado. Cuando se crea el índice agrupado, se adquiere un segundo bloqueo a corto plazo S para crear los índices no agrupados. Una vez creados los índices no agrupados, el S bloqueo se reduce a un IS bloqueo hasta la fase final de la operación de índice en línea.

Para obtener más información sobre cómo se usan los bloqueos y cómo se pueden administrar, consulte WAIT_AT_LOW_PRIORITY con operaciones de índice en línea.

Actividades de estructura de destino

En la tabla siguiente se muestran las actividades relacionadas con la estructura de destino durante cada fase de la operación de índice y la estrategia de bloqueo correspondiente.

Phase Actividad objetivo Bloqueos de objetivo
Preparation Se crea un nuevo índice y se define como de solo escritura. Intención compartida (IS)
Build Se insertan datos del origen.

Las modificaciones del usuario (inserciones, actualizaciones, eliminaciones) aplicadas al origen también se aplican al destino.

Esta actividad resulta transparente para el usuario.
Intención compartida (IS)
Final Se actualizan los metadatos de índice.

El índice se establece en modo de lectura y escritura.
Compartida (S) o modificación de esquemas (Sch-M)

No se accede al destino mediante consultas de usuario hasta que se completa la operación de índice.

Una vez completada la fase de preparación o final, es posible que los planes de consulta almacenados en la memoria caché del plan se invaliden.

La duración de un cursor declarado en una tabla implicada en una operación de índice en línea está limitada por las fases de dicho índice. Los cursores de actualización dejan de ser válidos en cada fase. Los cursores de solo lectura dejan de ser válidos después de la fase final.