Cómo funcionan las operaciones de índice en líneaHow Online Index Operations Work

SE APLICA A: síSQL Server síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

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 ellas.This topic defines the structures that exist during an online index operation and shows the activities associated with these structures.

Estructuras de índice en líneaOnline Index Structures

Para que se puedan llevar a cabo actividades de usuario simultáneas durante una operación de lenguaje de definición de datos (DDL) de índice, se usan las siguientes estructuras en la operación de índice en línea: índices preexistentes y de origen, destino y, para volver a compilar un montón o quitar un índice en línea agrupado, un índice de asignación temporal.To allow for concurrent user activity during an index data definition language (DDL) operation, the following structures are used during the online index operation: source and pre-existing indexes, target, and for rebuilding a heap or dropping a clustered index online, a temporary mapping index.

  • Índices preexistentes y de origenSource and pre-existing indexes

    El origen es la tabla original o los datos del índice clúster.The source is the original table or clustered index data. Los índices preexistentes son los índices no agrupados asociados con la estructura de origen.Pre-existing indexes are any nonclustered indexes that are associated with the source structure. Por ejemplo, si la operación de índice en línea vuelve a crear un índice agrupado que dispone de cuatro índices no agrupados asociados, el origen es el índice agrupado existente y los índices preexistentes son los índices no agrupados.For example, if the online index operation is rebuilding a clustered index that has four associated nonclustered indexes, the source is the existing clustered index and the pre-existing indexes are the nonclustered indexes.

    Los índices preexistentes están disponibles para que los usuarios simultáneos realicen operaciones de selección, inserción, actualización y eliminación.The pre-existing indexes are available to concurrent users for select, insert, update, and delete operations. Entre dichas operaciones se incluyen las inserciones masivas (que se admiten pero no se recomiendan) y las actualizaciones implícitas realizadas mediante desencadenadores y restricciones de integridad referencial.This includes bulk inserts (supported but not recommended) and implicit updates by triggers and referential integrity constraints. Todos los índices preexistentes están disponibles para las consultas y las búsquedas.All pre-existing indexes are available for queries and searches. Esto significa que se pueden seleccionar en el optimizador de consultas y, si es necesario, se pueden especificar en sugerencias de índice.This means they may be selected by the query optimizer and, if necessary, specified in index hints.

  • DestinoTarget

    Los destinos son el nuevo índice (o montón) o un conjunto de nuevos índices que se crean o se regeneran.The target or targets is the new index (or heap) or a set of new indexes that is being created or rebuilt. Durante la operación de índice, Motor de base de datos de SQL ServerSQL Server Database Engine aplica al destino las operaciones de inserción, actualización y eliminación de los usuarios efectuadas en el origen.User insert, update, and delete operations to the source are applied by the Motor de base de datos de SQL ServerSQL Server Database Engine to the target during the index operation. Por ejemplo, si la operación del índice en línea regenera un índice clúster, el destino es el índice clúster regenerado; Motor de base de datosDatabase Engine no regenera los índices no clúster cuando se regenera un índice clúster.For example, if the online index operation is rebuilding a clustered index, the target is the rebuilt clustered index; the Motor de base de datosDatabase Engine does not rebuild nonclustered indexes when a clustered index is rebuilt.

    Cuando se procesan instrucciones SELECT, no se realizan búsquedas en el índice de destino hasta que se confirma la operación de índice.The target index is not searched while processing SELECT statements until the index operation is committed. Internamente, el índice está marcado como de solo escritura.Internally, the index is marked as write-only.

  • Índice de asignación temporalTemporary mapping index

    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.Online index operations that create, drop, or rebuild a clustered index also require a temporary mapping index. Las transacciones simultáneas utilizan este índice temporal para determinar qué registros se deben eliminar en los nuevos índices que se regeneran cuando se actualizan o eliminan filas de la tabla subyacente.This temporary index is used by concurrent transactions to determine which records to delete in the new indexes that are being built when rows in the underlying table are updated or deleted. Este índice no clúster se crea en el mismo paso que el nuevo índice clúster (o montón) y no requiere una operación de ordenación separada.This nonclustered index is created in the same step as the new clustered index (or heap) and does not require a separate sort operation. Las transacciones simultáneas también mantienen el índice de asignación temporal en sus operaciones de inserción, actualización y eliminación.Concurrent transactions also maintain the temporary mapping index in all their insert, update, and delete operations.

Actividades del índice en líneaOnline Index Activities

Durante una operación de índice en línea sencilla, como la creación de un índice clúster en una tabla no indizada (montón), el origen y el destino pasan por tres fases: preparación, generación y final.During a simple online index operation, such as creating a clustered index on a nonindexed table (heap), the source and target go through three phases: preparation, build, and final.

En la ilustración siguiente se muestra el proceso para crear un índice clúster inicial en línea.The following illustration shows the process for creating an initial clustered index online. El objeto de origen (el montón) no dispone de otros índices.The source object (the heap) has no other indexes. Se muestran las actividades de las estructuras de origen y destino en cada fase; también se muestran las operaciones de usuario simultáneas de selección, inserción, actualización y eliminación.The source and target structure activities are shown for each phase; concurrent user select, insert, update, and delete operations are also shown. Las fases de preparación, generación y final se indican con los modos de bloqueo empleados en cada una de ellas.The preparation, build, and final phases are indicated together with the lock modes used in each phase.

Actividades realizadas durante la operación de índice en líneaActivities performed during online index operation

Actividades de la estructura de origenSource Structure Activities

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.The following table lists the activities involving the source structures during each phase of the index operation and the corresponding locking strategy.

FasePhase Actividad de origenSource activity Bloqueos de origenSource locks
PreparaciónPreparation

Fase breveShort phase
Preparación de los metadatos del sistema para crear la nueva estructura de índice vacía.System metadata preparation to create the new empty index structure.

Se define una instantánea de base de datos.A snapshot of the table is defined. Es decir, se utilizan las versiones de fila para proporcionar coherencia de lectura en la transacción.That is, row versioning is used to provide transaction-level read consistency.

Las operaciones de usuario simultáneas de escritura se bloquean durante un período breve.Concurrent user write operations on the source are blocked for a short period.

No se admiten las operaciones DDL simultáneas, excepto la creación de varios índices no clúster.No concurrent DDL operations are allowed except creating multiple nonclustered indexes.
S (Compartido) en la tabla*S (Shared) on the table*

IS (Intención compartida)IS (Intent Shared)

INDEX_BUILD_INTERNAL_RESOURCE**INDEX_BUILD_INTERNAL_RESOURCE**
CompilarBuild

Fase principalMain phase
Los datos se recorren, ordenan, combinan e insertan en el destino en operaciones de carga masiva.The data is scanned, sorted, merged, and inserted into the target in bulk load operations.

Las operaciones de usuario simultáneas de selección, inserción, actualización y eliminación se aplican a los índices preexistentes y a los nuevos índices que se compilan.Concurrent user select, insert, update, and delete operations are applied to both the pre-existing indexes and any new indexes being built.
ISIS

INDEX_BUILD_INTERNAL_RESOURCE**INDEX_BUILD_INTERNAL_RESOURCE**
FinalFinal

Fase breveShort phase
Antes de iniciar esta fase deben completarse todas las transacciones de actualización no confirmadas.All uncommitted update transactions must complete before this phase starts. Según el bloqueo aplicado, se bloquean brevemente las nuevas transacciones de lectura y escritura de usuario hasta que finaliza esta fase.Depending on the acquired lock, all new user read or write transactions are blocked for a short period until this phase is completed.

Se actualizan los metadatos del sistema para reemplazar el origen con el destino.System metadata is updated to replace the source with the target.

Si es preciso, el origen se quita.The source is dropped if it is required. Por ejemplo, después de regenerar o quitar un índice clúster.For example, after rebuilding or dropping a clustered index.
INDEX_BUILD_INTERNAL_RESOURCE**INDEX_BUILD_INTERNAL_RESOURCE**

S en la tabla si se crea un índice no agrupado.*S on the table if creating a nonclustered index.*

SCH-M (Modificación del esquema) si se quita alguna estructura de origen (índice o tabla).*SCH-M (Schema Modification) if any source structure (index or table) is dropped.*

* La operación de índice espera a que se completen las transacciones de actualización no confirmadas antes de aplicar el bloqueo S o SCH-M a la tabla.* The index operation waits for any uncommitted update transactions to complete before acquiring the S lock or SCH-M lock on the table.

** El bloqueo de recurso INDEX_BUILD_INTERNAL_RESOURCE evita la ejecución de operaciones de lenguaje de definición de datos (DDL) simultáneas en las estructuras preexistentes y de origen mientras la operación de índice está en curso.** The resource lock INDEX_BUILD_INTERNAL_RESOURCE prevents the execution of concurrent data definition language (DDL) operations on the source and pre-existing structures while the index operation is in progress. Por ejemplo, este bloqueo impide la regeneración simultánea de dos índices en la misma tabla.For example, this lock prevents concurrent rebuild of two indexes on the same table. Este bloqueo de recurso está asociado con el bloqueo Sch-M; sin embargo, no impide las instrucciones de manipulación de datos.Although this resource lock is associated with the Sch-M lock, it does not prevent data manipulation statements.

En la tabla anterior se muestra un solo bloqueo compartido (S) adquirido en la fase de generación de una operación de índice en línea que únicamente utiliza un índice.The previous table shows a single Shared (S) lock acquired during the build phase of an online index operation that involves a single index. Cuando se generan o se vuelven a generar índices clúster y no clúster en una sola operación de índice en línea (por ejemplo, durante la creación del índice clúster inicial en una tabla que contiene uno o varios índices no clúster) se aplican dos bloqueos S a corto plazo durante la fase de generación, seguidos de bloqueos de intención compartida (IS) a largo plazo.When clustered and nonclustered indexes are built, or rebuilt, in a single online index operation (for example, during the initial clustered index creation on a table that contains one or more nonclustered indexes) two short-term S locks are acquired during the build phase followed by long-term Intent Shared (IS) locks. En primer lugar, se aplica un bloqueo S para la creación del índice clúster; cuando esta operación finaliza, se aplica un segundo bloqueo S breve para crear los índices no clúster.One S lock is acquired first for the clustered index creation and when creating the clustered index is completed, a second short-term S lock is acquired for creating the nonclustered indexes. Después de crear los índices no clúster, el bloqueo S se reduce a un bloqueo IS hasta la fase final de la operación de índice en línea.After the nonclustered indexes are created, the S lock is downgraded to an IS lock until the final phase of the online index operation.

Actividades de la estructura de destinoTarget Structure Activities

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.The following table lists the activities that involve the target structure during each phase of the index operation and the corresponding locking strategy.

FasePhase Actividad de destinoTarget activity Bloqueos de destinoTarget locks
PreparaciónPreparation Se crea un nuevo índice y se define como de solo escritura.New index is created and set to write-only. ISIS
CompilarBuild Se insertan datos del origen.Data is inserted from source.

Se aplican las modificaciones de usuario (inserciones, actualizaciones, eliminaciones) aplicadas al origen.User modifications (inserts, updates, deletes) applied to the source are applied.

Esta actividad resulta transparente para el usuario.This activity is transparent to the user.
ISIS
FinalFinal Se actualizan los metadatos de índice.Index metadata is updated.

El índice se establece en un estado de lectura/escritura.Index is set to read/write status.
SS

o Administrador de configuración deor

SCH-MSCH-M

Las instrucciones SELECT del usuario no tienen acceso al destino hasta que finaliza la operación de índice.The target is not accessed by SELECT statements issued by the user until the index operation is completed.

Una vez finalizadas las fases de preparación y final, los planes de consulta y actualización almacenados en la memoria caché del procedimiento dejan de ser válidos.After the preparation and final phase is completed, the query and update plans that are stored in the procedure cache are invalidated. Las consultas posteriores usan el nuevo índice.Subsequent queries use the new index.

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.The lifetime of a cursor declared on a table that is involved in an online index operation is limited by the online index phases. Los cursores de actualización dejan de ser válidos en cada fase.Update cursors are invalidated at each phase. Los cursores de solo lectura dejan de ser válidos después de la fase final.Read-only cursors are invalidated only after the final phase.

Realizar operaciones de índice en líneaPerform Index Operations Online

Directrices para operaciones de índices en líneaGuidelines for Online Index Operations