Funzionamento delle operazioni sugli indici in linea
In questo argomento vengono descritte le strutture esistenti durante un'operazione sugli indici in linea e illustra le attività associate a tali strutture.
Strutture degli indici in linea
Per consentire attività utente simultanee durante un'operazione DDL sull'indice, vengono utilizzate le strutture seguenti durante l'operazione sull'indice in linea: indici di origine e preesistente, destinazione, e per gli indici cluster, 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 indici non cluster associati alla struttura di origine. Se ad esempio l'operazione sull'indice in linea consiste nella ricostruzione 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.
Gli indici preesistenti sono disponibili agli utenti simultanei per operazioni di selezione, inserimento, aggiornamento ed eliminazione, inclusi inserimenti bulk (supportati ma non consigliati) e aggiornamenti impliciti mediante trigger e vincoli di integrità referenziale. Tutti gli indici preesistenti sono disponibili per l'esecuzione di query e ricerche. Ciò significa che possono essere selezionati da Query Optimizer e, se necessario, specificati in hint per l'indice.
Destinazione
La destinazione o le destinazioni sono rappresentate dal nuovo indice (o heap) o da un set di nuovi indici creati o ricostruiti. Le operazioni utente di inserimento, aggiornamento ed eliminazione sull'origine vengono applicate da Motore di database di SQL Server alla destinazione durante l'operazione sull'indice. Se ad esempio l'operazione sull'indice in linea consiste nella ricostruzione di un indice cluster, la destinazione è l'indice cluster ricostruito. Motore di database non ricostruisce indici non cluster quando viene ricostruito un indice cluster.
Nell'indice di destinazione non viene eseguita la ricerca durante l'elaborazione delle istruzioni SELECT finché non viene eseguito il commit dell'operazione. L'indice viene contrassegnato internamente come di sola scrittura.
Indice di mapping temporaneo
Per le operazioni sugli indici in linea che consistono nella creazione, nell'eliminazione o nella ricostruzione di un indice cluster è inoltre necessario un indice di mapping temporaneo che viene utilizzato dalle transazioni simultanee per determinare i record da eliminare nei nuovi indici ricostruiti quando vengono aggiornate o eliminate righe nella tabella sottostante. Questo indice non cluster viene creato contemporaneamente al 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 in linea
Durante un'operazione sugli indici in linea 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 costruzione e finale.
Nella figura seguente viene illustrato il processo per la creazione di un indice cluster iniziale in linea. L'oggetto di origine, l'heap, non ha altri indici. 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. Le fasi preparatoria, di costruzione e finale sono indicate insieme alle modalità di blocco utilizzate in ogni fase.
Attività relative alla struttura di origine
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.
Fase |
Attività di origine |
Blocchi di origine |
---|---|---|
Preparatoria Fase molto breve |
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. Per ulteriori informazioni, vedere Informazioni sui livelli di isolamento basati sul controllo delle versioni delle righe. Le operazioni utente di scrittura simultanee 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. |
S (condiviso) nella tabella* IS (preventivo condiviso) INDEX_BUILD_INTERNAL_RESOURCE** |
Costruzione Fase principale |
I dati vengono sottoposti a scansione, ordinati, uniti e inseriti nella destinazione in operazioni di caricamento bulk. Le operazioni utente simultanee di selezione, inserimento, aggiornamento ed eliminazione vengono applicate agli indici preesistenti e ai nuovi indici creati. |
IS (preventivo condiviso) INDEX_BUILD_INTERNAL_RESOURCE** |
Fase finale Fase molto breve |
Prima dell'avvio di questa fase, è necessario che tutte le transazioni di aggiornamento di cui non è stato eseguito il commit vengano completate. 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. I metadati di sistema vengono aggiornati per sostituire l'origine con la destinazione. Se necessario, l'origine viene eliminata, ad esempio dopo la ricostruzione o l'eliminazione di un indice cluster. |
INDEX_BUILD_INTERNAL_RESOURCE** S (condiviso) nella tabella se viene creato un indice non cluster.* SCH-M (modifica dello schema) se viene eliminata la struttura di origine (indice o tabella).* |
* L'operazione sull'indice 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.
** Il blocco di risorsa INDEX_BUILD_INTERNAL_RESOURCE impedisce l'esecuzione di operazioni DDL simultanee sulle strutture di origine e preesistenti mentre è in corso l'operazione sull'indice. Questo blocco impedisce ad esempio la ricostruzione simultanea di due indici nella stessa tabella. Nonostante questo blocco di risorsa sia associato al blocco SCH-M, non impedisce l'esecuzione di istruzioni DML.
Nella tabella precedente è incluso un solo blocco condiviso (S) acquisito durante la fase di costruzione di un'operazione sugli indici in linea relativa a un singolo indice. Quando si costruiscono o ricostruiscono indici cluster e non cluster, in una singola operazione sugli indici in linea (ad esempio durante la costruzione dell'indice cluster iniziale in una tabella contenente uno o più indici non cluster) vengono acquisiti due blocchi condivisi (S) di breve durata durante la fase di costruzione seguiti da blocchi IS di lunga durata. 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. 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 in linea.
Attività relative alla 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.
Fase |
Attività di destinazione |
Blocchi di destinazione |
---|---|---|
Preparatoria |
Il nuovo indice viene creato e impostato in sola scrittura. |
IS (preventivo condiviso) |
Costruzione |
Vengono inseriti i dati dall'origine. Vengono applicate le modifiche utente (inserimenti, aggiornamenti, eliminazioni) apportate all'origine. Questa attività è visibile all'utente. |
IS (preventivo condiviso) |
Fase finale |
Vengono aggiornati i metadati dell'indice. Viene impostato lo stato lettura/scrittura per l'indice. |
S (condiviso) Oppure SCH-M (modifica dello schema) |
Le istruzioni SELECT eseguite dall'utente non possono accedere alla destinazione finché l'operazione sull'indice non è stata completata.
Dopo il completamento della fase preparatoria e della fase finale, i piani di aggiornamento e di query archiviati nella cache delle procedure vengono invalidati e per le query successive verrà utilizzato il nuovo indice.
La durata di un cursore dichiarato in una tabella oggetto di un'operazione su un indice in linea è 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.