Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL Database in Anteprima di Microsoft Fabric
Questo articolo definisce le strutture esistenti durante un'operazione sull'indice online e mostra le attività associate a queste strutture.
Strutture degli indici online
Per consentire l'attività utente simultanea durante un'operazione DDL (Data Definition Language) dell'indice, durante l'operazione sull'indice online vengono usate le strutture seguenti: indici di origine e preesistenti, di destinazione, e per la ricostruzione di un heap o l'eliminazione online di un indice clusterizzato, un indice di mapping temporaneo.
Indici di origine e preesistenti
L'origine è rappresentata dalla tabella originale o dai dati dell'indice cluster. Gli indici preesistenti sono tutti gli indici non cluster associati alla struttura di origine. Ad esempio, se l'operazione sull'indice online ricompila un indice cluster con quattro indici non cluster associati, l'origine è l'indice cluster esistente e gli indici preesistenti sono gli indici non cluster.
Gli indici preesistenti sono disponibili per gli utenti simultanei per le operazioni di selezione, inserimento, aggiornamento ed eliminazione. Sono inclusi inserimenti in blocco (supportati ma non consigliati durante un'operazione sugli indici online) e aggiornamenti impliciti da trigger e vincoli di integrità referenziale. Tutti gli indici preesistenti sono disponibili per le query. Ciò significa che possono essere selezionati da Query Optimizer e, se necessario, specificati negli hint di indice.
Target
La destinazione o le destinazioni sono rappresentate dal nuovo indice (o heap) o da un set di nuovi indici creati o ricompilati. Le operazioni di inserimento, aggiornamento ed eliminazione dell'utente nell'origine vengono applicate dal Motore di Database alla destinazione durante l'operazione di indicizzazione. Ad esempio, se l'operazione sull'indice online ricompila un indice cluster, la destinazione è l'indice cluster ricompilato; Il motore di database non ricompila gli indici non cluster quando viene ricompilato un indice cluster.
L'indice di destinazione non viene usato finché non viene effettuato il commit dell'operazione di indice. L'indice viene contrassegnato internamente come di sola scrittura.
Indice di mapping temporaneo
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 temporaneo Questo indice temporaneo viene utilizzato dalle transazioni simultanee per determinare quali record eliminare nei nuovi indici compilati quando le righe della tabella di origine vengono aggiornate o eliminate. Questo indice non cluster viene creato nello stesso passaggio del nuovo indice cluster (o heap) e non richiede un'operazione di ordinamento separata. Le transazioni simultanee mantengono l'indice di mapping temporaneo in tutte le operazioni di inserimento, aggiornamento ed eliminazione.
Attività sugli indici online
Durante un'operazione sull'indice online, ad esempio la creazione di un indice cluster in una tabella non indicizzata (heap), l'origine e la destinazione passano attraverso tre fasi: preparazione, compilazione e finale.
È possibile usare l'evento progress_report_online_index_operation
esteso per monitorare lo stato di avanzamento di un'operazione sull'indice online.
Nella figura seguente si illustra il processo per la creazione di un indice cluster iniziale online. L'oggetto di origine, l'heap, non presenta altri indici. Le attività della struttura di origine e di destinazione sono mostrate per ogni fase; vengono inoltre visualizzate le operazioni simultanee SELECT
, INSERT
, UPDATE
e DELETE
. Le fasi preparatoria, di compilazione e finale sono indicate insieme alle modalità di blocco utilizzate in ogni fase.
Attività di strutturazione della fonte
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.
Phase | Source activity | Source locks |
---|---|---|
Preparation Short phase |
Preparazione dei metadati di sistema per la creazione della nuova struttura vuota dell'indice. Viene definito uno snapshot della tabella, ovvero viene utilizzato il controllo delle versioni delle righe per garantire la consistenza in lettura a livello di transazione. Le operazioni di scrittura di utenti simultanei sull'origine vengono bloccate per un breve periodo di tempo. Non sono consentite operazioni DDL simultanee, ad eccezione della creazione di più indici non cluster. |
Elemento condiviso (S ) nella tabella1Finalità condivisa ( IS )Blocco dell'oggetto di modifica dello schema ( Sch-M ) con il sottotipo di risorsa INDEX_OPERATION 2 |
Build Main phase |
I dati vengono analizzati, ordinati, uniti e inseriti nella destinazione usando operazioni di caricamento in blocco. Le operazioni simultanee INSERT , UPDATE , DELETE , e MERGE vengono applicate sia agli indici preesistenti che agli eventuali nuovi indici compilati. |
Finalità condivisa (IS )Sch-M blocco dell'oggetto con il sottotipo di risorsa INDEX_OPERATION 2 |
Final Short phase |
Tutte le transazioni di scrittura di cui non è stato eseguito il commit devono essere completate prima dell'avvio di questa fase. A seconda del blocco acquisito, tutte le transazioni di lettura o scrittura di tutti i nuovi utenti vengono bloccate per un breve periodo fino al completamento di questa fase. I metadati di sistema vengono aggiornati per sostituire l'origine con la destinazione. L'origine viene eliminata se necessario, ad esempio dopo la ricompilazione o l'eliminazione di un indice cluster. |
Sch-M blocco dell'oggetto con il sottotipo di risorsa INDEX_OPERATION 2Condiviso ( S ) nella tabella se si crea un indice non clusterizzato.1Sch-M se una struttura di origine (indice o tabella) viene eliminata. 1 |
1 L'operazione sull'indice attende il completamento di tutte le transazioni di scrittura di cui non è stato eseguito il commit prima di acquisire il S
blocco o il Sch-M
blocco nella tabella. Se viene eseguita una query con esecuzione prolungata, l'operazione sull'indice online resta in attesa fino al completamento della query. A meno che non vengano utilizzati blocchi con priorità bassa, potrebbe formare una catena di blocco.
2 Un Sch-M
blocco di oggetti con il sottotipo INDEX_OPERATION
di risorsa impedisce l'esecuzione di operazioni DDL (Data Definition Language) simultanee sulle strutture di origine e preesistenti mentre l'operazione sull'indice è in corso. Questo blocco impedisce ad esempio la ricompilazione simultanea di due indici nella stessa tabella. Anche se si tratta di un Sch-M
blocco, non impedisce le istruzioni di manipolazione dei dati.
La tabella precedente mostra un singolo blocco condiviso (S
) acquisito durante la fase di compilazione di un'operazione sull'indice online che coinvolge un singolo indice. Quando gli indici cluster e non cluster vengono compilati o ricompilati, in una singola operazione sull'indice online (ad esempio, durante la creazione iniziale dell'indice cluster in una tabella che contiene uno o più indici non cluster) vengono acquisiti due blocchi a breve termine S
durante la fase di compilazione seguita da blocchi condivisi (IS
) con finalità a lungo termine. Viene prima acquisito un S
lock per la creazione dell'indice cluster. Quando viene creato l'indice con cluster, viene acquisito un secondo blocco temporaneo S
per la creazione degli indici non con cluster. Dopo aver creato gli indici non clusterizzati, il S
blocco viene declassato a un IS
blocco fino alla fase finale dell'operazione di indicizzazione online.
Per ulteriori informazioni su come vengono usati i blocchi e su come gestirli, vedere WAIT_AT_LOW_PRIORITY nelle operazioni sugli indici online.
Attività della struttura di destinazione
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.
Phase | Target activity | Target locks |
---|---|---|
Preparation | Il nuovo indice viene creato e impostato in sola scrittura. | Finalità condivisa (IS ) |
Build | Vengono inseriti i dati dall'origine. Anche le modifiche utente (inserimenti, aggiornamenti, eliminazioni) applicate all'origine vengono applicate alla destinazione. Questa attività è visibile all'utente. |
Finalità condivisa (IS ) |
Final | Vengono aggiornati i metadati dell'indice. L'indice è impostato sullo stato di lettura/scrittura. |
Condivisione (S ) o modifica dello schema (Sch-M ) |
La destinazione non è accessibile dalle query degli utenti fino a quando l'operazione sull'indice non è completata.
Al termine della fase di preparazione o finale, i piani di query archiviati nella cache dei piani potrebbero essere invalidati.
La durata di un cursore dichiarato in una tabella oggetto di un'operazione su un indice online è limitata dalle fasi dell'operazione sull'indice. I cursori di aggiornamento vengono invalidati in corrispondenza di ogni fase, mentre i cursori di sola lettura vengono invalidati solo dopo la fase finale.