Funzionamento delle operazioni sugli indici onlineHow Online Index Operations Work

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2016)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

In questo argomento vengono descritte le strutture esistenti durante un'operazione sugli indici online e illustra le attività associate a tali strutture.This topic defines the structures that exist during an online index operation and shows the activities associated with these structures.

Strutture degli indici onlineOnline Index Structures

Per consentire attività utente simultanee durante un'operazione DDL (Data Definition Language) sull'indice, durante l'operazione sull'indice online vengono utilizzate le strutture seguenti: indici di origine e preesistente, destinazione e, per la ricompilazione di un heap o l'eliminazione di un indice cluster online, un indice di mapping temporaneo.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 preexisting indexes, target, and for rebuilding a heap or dropping a clustered index online, a temporary mapping index.

  • Indici di origine e preesistentiSource and preexisting indexes

    L'origine è rappresentata dalla tabella originale o dai dati dell'indice cluster.The source is the original table or clustered index data. Gli indici preesistenti sono indici non cluster associati alla struttura di origine.Preexisting indexes are any nonclustered indexes that are associated with the source structure. Se ad esempio l'operazione sull'indice online consiste nella ricompilazione di un indice cluster con quattro indici non cluster associati, l'origine è l'indice cluster esistente e gli indici preesistenti sono gli indici non cluster.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 preexisting indexes are the nonclustered indexes.

    Gli indici preesistenti sono disponibili agli utenti simultanei per operazioni di selezione, inserimento, aggiornamento ed eliminazione,The preexisting indexes are available to concurrent users for select, insert, update, and delete operations. inclusi inserimenti bulk (supportati ma non consigliati) e aggiornamenti impliciti mediante trigger e vincoli di integrità referenziale.This includes bulk inserts (supported but not recommended) and implicit updates by triggers and referential integrity constraints. Tutti gli indici preesistenti sono disponibili per l'esecuzione di query e ricerche.All preexisting indexes are available for queries and searches. Ciò significa che possono essere selezionati da Query Optimizer e, se necessario, specificati in hint per l'indice.This means they may be selected by the query optimizer and, if necessary, specified in index hints.

  • DestinazioneTarget

    La destinazione o le destinazioni sono rappresentate dal nuovo indice (o heap) o da un set di nuovi indici creati o ricompilati.The target or targets is the new index (or heap) or a set of new indexes that is being created or rebuilt. Le operazioni utente di inserimento, aggiornamento ed eliminazione sull'origine vengono applicate da Motore di database di SQL ServerSQL Server Database Engine alla destinazione durante l'operazione sull'indice.User insert, update, and delete operations to the source are applied by the Motore di database di SQL ServerSQL Server Database Engine to the target during the index operation. Se ad esempio l'operazione sull'indice online consiste nella ricompilazione di un indice cluster, la destinazione è l'indice cluster ricompilato. Motore di databaseDatabase Engine non ricompila indici non cluster quando viene ricompilato un indice cluster.For example, if the online index operation is rebuilding a clustered index, the target is the rebuilt clustered index; the Motore di databaseDatabase Engine does not rebuild nonclustered indexes when a clustered index is rebuilt.

    Nell'indice di destinazione non viene eseguita la ricerca durante l'elaborazione delle istruzioni SELECT finché non viene eseguito il commit dell'operazione.The target index is not searched while processing SELECT statements until the index operation is committed. L'indice viene contrassegnato internamente come di sola scrittura.Internally, the index is marked as write-only.

  • Indice di mapping temporaneoTemporary mapping index

    Per le operazioni sugli indici online che consistono nella creazione, nell'eliminazione o nella ricompilazione di un indice cluster è inoltre necessario un indice di mapping temporaneoOnline index operations that create, drop, or rebuild a clustered index also require a temporary mapping index. che viene utilizzato dalle transazioni simultanee per determinare i record da eliminare nei nuovi indici ricompilati quando vengono aggiornate o eliminate righe nella tabella sottostante.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. Questo indice non cluster viene creato contemporaneamente al nuovo indice cluster (o heap) e non richiede un'operazione di ordinamento separata.This nonclustered index is created in the same step as the new clustered index (or heap) and does not require a separate sort operation. Le transazioni simultanee mantengono l'indice di mapping temporaneo in tutte le operazioni di inserimento, aggiornamento ed eliminazione.Concurrent transactions also maintain the temporary mapping index in all their insert, update, and delete operations.

Attività sugli indici onlineOnline Index Activities

Durante un'operazione sugli indici online semplice, ad esempio la creazione di un indice cluster in una tabella non indicizzata (heap), l'origine e la destinazione passano attraverso tre fasi: preparatoria, di compilazione e finale.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.

Nella figura seguente si illustra il processo per la creazione di un indice cluster iniziale online.The following illustration shows the process for creating an initial clustered index online. L'oggetto di origine, l'heap, non presenta altri indici.The source object (the heap) has no other indexes. Per ogni fase sono illustrate le attività sulle strutture di origine e di destinazione, nonché le operazioni utente simultanee di selezione, inserimento, aggiornamento ed eliminazione.The source and target structure activities are shown for each phase; concurrent user select, insert, update, and delete operations are also shown. Le fasi preparatoria, di compilazione e finale sono indicate insieme alle modalità di blocco utilizzate in ogni fase.The preparation, build, and final phases are indicated together with the lock modes used in each phase.

Attività eseguite durante l'operazione sull'indice onlineActivities performed during online index operation

Attività relative alla struttura di origineSource Structure Activities

Nella tabella seguente sono incluse le attività relative alle strutture di origine durante ogni fase dell'operazione sull'indice e la relativa strategia di blocco.The following table lists the activities involving the source structures during each phase of the index operation and the corresponding locking strategy.

FasePhase Attività di origineSource activity Blocchi di origineSource locks
PreparazionePreparation

Fase molto breveVery short phase
Preparazione dei metadati di sistema per la creazione della nuova struttura vuota dell'indice.System metadata preparation to create the new empty index structure.

Viene definito uno snapshot della tabella,A snapshot of the table is defined. ovvero viene utilizzato il controllo delle versioni delle righe per garantire la consistenza in lettura a livello di transazione.That is, row versioning is used to provide transaction-level read consistency.

Le operazioni utente di scrittura simultanee sull'origine vengono bloccate per un breve periodo di tempo.Concurrent user write operations on the source are blocked for a very short period.

Non sono consentite operazioni DDL simultanee, ad eccezione della creazione di più indici non cluster.No concurrent DDL operations are allowed except creating multiple nonclustered indexes.
S (condiviso) nella tabellaS (Shared) on the table

IS (preventivo condiviso)IS (Intent Shared)

INDEX_BUILD_INTERNAL_RESOURCE**INDEX_BUILD_INTERNAL_RESOURCE**
CompilazioneBuild

Fase principaleMain phase
I dati vengono sottoposti ad analisi, ordinati, uniti e inseriti nella destinazione in operazioni di caricamento bulk.The data is scanned, sorted, merged, and inserted into the target in bulk load operations.

Le operazioni utente simultanee di selezione, inserimento, aggiornamento ed eliminazione vengono applicate agli indici preesistenti e ai nuovi indici compilati.Concurrent user select, insert, update, and delete operations are applied to both the preexisting indexes and any new indexes being built.
ISIS

INDEX_BUILD_INTERNAL_RESOURCEINDEX_BUILD_INTERNAL_RESOURCE
FinaleFinal

Fase molto breveVery short phase
Prima dell'avvio di questa fase, è necessario che tutte le transazioni di aggiornamento di cui non è stato eseguito il commit vengano completate.All uncommitted update transactions must complete before this phase starts. A seconda del blocco acquisito, tutte le nuove transazioni utente di lettura o di scrittura vengono bloccate per un breve periodo di tempo finché questa fase non viene completata.Depending on the acquired lock, all new user read or write transactions are blocked for a very short period until this phase is completed.

I metadati di sistema vengono aggiornati per sostituire l'origine con la destinazione.System metadata is updated to replace the source with the target.

Se necessario, l'origine viene eliminata,The source is dropped if it is required. ad esempio dopo la ricompilazione o l'eliminazione di un indice cluster.For example, after rebuilding or dropping a clustered index.
INDEX_BUILD_INTERNAL_RESOURCEINDEX_BUILD_INTERNAL_RESOURCE

S nella tabella se viene creato un indice non cluster.*S on the table if creating a nonclustered index.*

SCH-M (modifica dello schema) se viene eliminata la struttura di origine (indice o tabella).*SCH-M (Schema Modification) if any source structure (index or table) is dropped.*

* Per l'operazione sull'indice si dovrà attendere il completamento delle transazioni di aggiornamento di cui non è stato eseguito il commit prima di acquisire il blocco S o SCH-M nella tabella.* The index operation will wait for any uncommitted update transactions to complete before acquiring the S lock or SCH-M lock on the table.

** Con il blocco di risorsa INDEX_BUILD_INTERNAL_RESOURCE viene impedita l'esecuzione di operazioni DDL (Data Definition Language) simultanee sulle strutture di origine e preesistenti mentre è in corso l'operazione sull'indice.** The resource lock INDEX_BUILD_INTERNAL_RESOURCE prevents the execution of concurrent data definition language (DDL) operations on the source and preexisting structures while the index operation is in progress. Questo blocco impedisce ad esempio la ricompilazione simultanea di due indici nella stessa tabella.For example, this lock prevents concurrent rebuild of two indexes on the same table. Nonostante questo blocco di risorsa sia associato al blocco SCH-M, non impedisce l'esecuzione di istruzioni DML.Although this resource lock is associated with the Sch-M lock, it does not prevent data manipulation statements.

Nella tabella precedente è incluso un solo blocco condiviso (S) acquisito durante la fase di compilazione di un'operazione sugli indici online relativa a un singolo indice.The previous table shows a single Shared (S) lock acquired during the build phase of an online index operation that involves a single index. Quando si compilano o ricompilano indici cluster e non cluster, in una singola operazione sugli indici online, ad esempio durante la creazione dell'indice cluster iniziale in una tabella contenente uno o più indici non cluster, vengono acquisiti due blocchi S di breve durata durante la fase di compilazione seguiti da blocchi preventivi condivisi (IS) di lunga durata.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. Viene innanzitutto acquisito un blocco S per la creazione dell'indice cluster e, quando la creazione dell'indice cluster viene completata, viene acquisito un altro blocco S di breve durata per la creazione degli indici non cluster.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. Dopo la creazione degli indici non cluster, il blocco S viene abbassato di livello e portato a blocco IS fino alla fase finale dell'operazione sull'indice online.After the nonclustered indexes are created, the S lock is downgraded to an IS lock until the final phase of the online index operation.

Attività relative alla struttura di destinazioneTarget Structure Activities

Nella tabella seguente sono incluse le attività relative alla struttura di destinazione durante ogni fase dell'operazione sull'indice e la relativa strategia di blocco.The following table lists the activities that involve the target structure during each phase of the index operation and the corresponding locking strategy.

FasePhase Attività di destinazioneTarget activity Blocchi di destinazioneTarget locks
PreparazionePreparation Il nuovo indice viene creato e impostato in sola scrittura.New index is created and set to write-only. ISIS
CompilazioneBuild Vengono inseriti i dati dall'origine.Data is inserted from source.

Vengono applicate le modifiche utente (inserimenti, aggiornamenti, eliminazioni) apportate all'origine.User modifications (inserts, updates, deletes) applied to the source are applied.

Questa attività è visibile all'utente.This activity is transparent to the user.
ISIS
FinaleFinal Vengono aggiornati i metadati dell'indice.Index metadata is updated.

Viene impostato lo stato lettura/scrittura per l'indice.Index is set to read/write status.
SS

oor

SCH-MSCH-M

Con le istruzioni SELECT eseguite dall'utente non è possibile accedere alla destinazione finché l'operazione sull'indice non è stata completata.The target is not accessed by SELECT statements issued by the user until the index operation is completed.

Dopo il completamento della fase preparatoria e della fase finale, i piani di aggiornamento e di query archiviati nella cache delle procedure vengono invalidatiAfter the preparation and final phase is completed, the query and update plans that are stored in the procedure cache are invalidated. e per le query successive verrà utilizzato il nuovo indice.Subsequent queries will use the new index.

La durata di un cursore dichiarato in una tabella oggetto di un'operazione su un indice online è limitata dalle fasi dell'operazione sull'indice.The lifetime of a cursor declared on a table that is involved in an online index operation is limited by the online index phases. I cursori di aggiornamento vengono invalidati in corrispondenza di ogni fase,Update cursors are invalidated at each phase. mentre i cursori di sola lettura vengono invalidati solo dopo la fase finale.Read-only cursors are invalidated only after the final phase.

Eseguire operazioni online sugli indiciPerform Index Operations Online

Linee guida per operazioni di indice onlineGuidelines for Online Index Operations