Compartir a través de


Funcionamiento de las operaciones de índice en línea

En este tema 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 de índice agrupados. 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) y actualizaciones implícitas por desencadenadores y restricciones de integridad referencial. Todos los índices preexistentes están disponibles para consultas y búsquedas. Esto significa que pueden seleccionarse mediante el optimizador de consultas y, si es necesario, se especifican en sugerencias de índice.

  • de destino

    El destino o los destinos son el nuevo índice (o montículo) o un conjunto de índices nuevos que se están creando o reconstruyendo. El motor de base de datos de SQL Server aplica las operaciones de inserción, actualización y eliminación del usuario al origen durante la operación de índice. 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 clúster cuando se vuelve a generar un índice agrupado.

    El índice de destino no se busca mientras se procesan instrucciones SELECT hasta que se confirma la operación de índice. Internamente, el índice se marca como de solo escritura.

  • Índice de asignación temporal

    Las operaciones de índice en línea que crean, quitan o recompilan un índice agrupado también requieren un índice de asignación temporal. Las transacciones simultáneas usan este índice temporal para determinar qué registros se van a eliminar en los nuevos índices que se compilan cuando se actualizan o eliminan las filas de la tabla subyacente. 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 también 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 simple, 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.

En la ilustración siguiente se muestra el proceso para crear un índice agrupado inicial en línea. El objeto de origen (el montón) no tiene ningún otro índice. Las actividades de estructura de origen y destino se muestran para cada fase; También se muestran las operaciones simultáneas de selección de usuarios, inserción, actualización y eliminación. Las fases de preparación, compilación y final se indican junto con los modos de bloqueo utilizados en cada fase.

Actividades realizadas durante la operación de índice en línea

Actividades de estructura fuente

En la tabla siguiente se enumeran las actividades que implican las estructuras de origen durante cada fase de la operación de índice y la estrategia de bloqueo correspondiente.

Fase Actividad de origen Bloqueos de origen
Preparación

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

Se define una instantánea de la tabla. Es decir, el control de versiones de fila se utiliza para proporcionar coherencia de lectura a nivel de transacción.

Las operaciones de escritura simultánea de usuarios en el origen se bloquean durante un período muy breve.

No se permite ninguna operación DDL simultánea, excepto la creación de varios índices no clúster.
S (Compartido) en la tabla*

IS (Intención Compartida)

INDEX_BUILD_INTERNAL_RESOURCE**
Construir

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

Las operaciones simultáneas de selección, inserción, actualización y eliminación de usuarios se aplican tanto a los índices preexistentes como a los índices nuevos que se compilan.
ES

INDEX_BUILD_INTERNAL_RESOURCE**
Final

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

Los metadatos del sistema se actualizan para reemplazar el origen por el destino.

La fuente se elimina si es necesario. Por ejemplo, después de volver a generar o quitar un índice agrupado.
INDEX_BUILD_INTERNAL_RESOURCE**

S en la tabla si crea un índice no agrupado.*

SCH-M (Modificación del esquema) si se quita cualquier estructura de origen (índice o tabla). *

* La operación de indización esperará a que las transacciones de actualización no confirmadas se completen antes de adquirir el bloqueo S o el bloqueo SCH-M en la tabla.

** El bloqueo de recursos INDEX_BUILD_INTERNAL_RESOURCE 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 recompilación simultánea de dos índices en la misma tabla. Aunque este bloqueo de recursos está asociado al bloqueo de Sch-M, 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 S a corto plazo durante la fase de compilación seguida de bloqueos compartidos de intención a largo plazo (IS). Primero se adquiere un bloqueo S para la creación del índice agrupado, y cuando se completa dicha creación, se adquiere un segundo bloqueo S a corto plazo para crear los índices no agrupados. Una vez creados los índices no clúster, el bloqueo S se degrada a un bloqueo IS hasta la fase final de la operación de índice en línea.

Actividades relacionadas con la estructura objetivo

En la tabla siguiente se enumeran las actividades que implican el uso de la estructura de destino durante cada fase de la operación de índice y la estrategia de bloqueo correspondiente.

Fase Actividad objetivo Bloqueos de destino
Preparación Se crea un nuevo índice y se establece en modo de solo escritura. ES
Construir Los datos se insertan desde el origen.

Se aplican las modificaciones de usuario (inserciones, actualizaciones, eliminaciones) al origen.

Esta actividad es transparente para el usuario.
ES
Final Los metadatos de índice se actualizan.

El índice está configurado para estado de lectura y escritura.
S

o

SCH-M

El usuario no tiene acceso al destino mediante instrucciones SELECT emitidas hasta que se complete la operación de índice.

Una vez completada la fase de preparación y final, se invalidan los planes de consulta y actualización almacenados en la caché de procedimientos. Las consultas posteriores usarán el nuevo índice.

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 índice en línea. Los cursores de actualización se invalidan en cada fase. Los cursores de solo lectura se invalidan solo después de la fase final.

Realizar operaciones de índice en línea

Directrices para operaciones de índices en línea