Disabilitare indici e vincoli
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure
Questo articolo illustra come disabilitare un indice o i vincoli in SQL Server usando SQL Server Management Studio o Transact-SQL. La disabilitazione di un indice impedisce all'utente di accedere all'indice e, per gli indici cluster, ai dati della tabella sottostante. La definizione dell'indice viene mantenuta nei metadati e le statistiche relative all'indice vengono preservate negli indici non cluster. La disabilitazione di un indice non cluster o di un indice cluster di una vista elimina fisicamente i dati dell'indice.
La disabilitazione di un indice cluster in una tabella impedisce l'accesso ai dati. Questi ultimi vengono comunque mantenuti nella tabella, ma non sono disponibili per le operazioni DML (Data Manipulation Language) finché l'indice non viene eliminato o ricompilato.
Limiti
In caso di disabilitazione, l'indice non viene aggiornato.
In Query Optimizer l'indice disabilitato non viene considerato durante la creazione dei piani di esecuzione della query. Inoltre, le query che fanno riferimento all'indice disabilitato con un hint di tabella non vengono eseguite correttamente.
Non è possibile creare un indice assegnandogli lo stesso nome di un indice disabilitato esistente.
Un indice disabilitato può essere eliminato.
Quando si disabilita un indice univoco, vengono disabilitati anche il vincolo PRIMARY KEY
o UNIQUE
e tutti i vincoli FOREIGN KEY
che fanno riferimento alle colonne di indice di altre tabelle. Quando si disabilita un indice cluster, vengono disabilitati anche tutti i vincoli FOREIGN KEY
in ingresso e in uscita nella tabella sottostante. Quando viene disabilitato l'indice, i nomi dei vincoli vengono elencati in un messaggio di avviso. Dopo aver ricompilato l'indice, è necessario abilitare manualmente tutti i vincoli utilizzando l'istruzione ALTER TABLE CHECK CONSTRAINT
.
Gli indici non cluster vengono disabilitati automaticamente quando viene disabilitato l'indice cluster associato e non possono essere abilitati fino all'abilitazione dell'indice cluster nella tabella o nella vista o all'eliminazione dell'indice cluster nella tabella. Gli indici non cluster devono essere abilitati in modo esplicito, a meno che l'indice cluster non sia stato abilitato utilizzando l'istruzione ALTER INDEX ALL REBUILD
.
L'istruzione ALTER INDEX ALL REBUILD
consente di ricompilare e abilitare tutti gli indici disabilitati nella tabella, ad eccezione degli indici disabilitati nelle viste. Gli indici nelle viste devono essere abilitati in un'istruzione ALTER INDEX ALL REBUILD
distinta.
La disabilitazione di un indice cluster in una tabella consente di disabilitare anche tutti gli indici cluster e non cluster nelle viste che fanno riferimento a quella tabella. Questi indici devono essere ricompilati immediatamente proprio come gli indici nella tabella a cui si fa riferimento.
È possibile accedere alle righe di dati degli indici cluster disabilitati solo per eliminare o ricompilare l'indice cluster.
È possibile ricompilare online un indice non cluster disabilitato quando nella tabella non è incluso un indice cluster disabilitato. Tuttavia, è sempre necessario ricompilare offline un indice cluster disabilitato se si utilizza l'istruzione ALTER INDEX REBUILD
o CREATE INDEX WITH DROP_EXISTING
. Per altre informazioni sulle operazioni online sugli indici, vedere Eseguire operazioni online sugli indici.
L'istruzione CREATE STATISTICS
non può essere eseguita correttamente in una tabella in cui è incluso un indice cluster disabilitato.
L'opzione di database AUTO_CREATE_STATISTICS
crea nuove statistiche per una colonna quando l'indice viene disabilitato e si verificano le condizioni seguenti:
AUTO_CREATE_STATISTICS
è impostato suON
.- Non è disponibile alcuna statistica esistente per la colonna.
- Le statistiche sono necessarie durante l'ottimizzazione delle query.
Se un indice cluster è disabilitato, tramite l'istruzione DBCC CHECKDB non possono essere restituite informazioni sulla tabella sottostante, ma può essere indicato che l'indice cluster è disabilitato. L'istruzioneDBCC INDEXDEFRAG non può essere utilizzata per deframmentare un indice disabilitato, altrimenti l'operazione non viene completata e viene visualizzato un messaggio di errore. Per ricompilare un indice disabilitato, è possibile utilizzare l'istruzione DBCC DBREINDEX .
La creazione di un nuovo indice cluster comporta l'abilitazione degli indici non cluster disabilitati precedentemente. Per altre informazioni, vedere Enable Indexes and Constraints.
Se la tabella è un heap, tutti gli indici non cluster verranno ricompilati.
Autorizzazioni
Per eseguire ALTER INDEX
, è necessaria almeno l'autorizzazione ALTER
per la tabella o la vista.
Usare SQL Server Management Studio
Disabilitare un indice
In Esplora oggetti fare clic sul segno di addizione per espandere il database contenente la tabella in cui si desidera disabilitare un indice.
Selezionare il segno di addizione per espandere la cartella Tabelle.
Fare clic sul segno di addizione per espandere la tabella in cui si desidera disabilitare un indice.
Fare clic sul segno di addizione per espandere la cartella Indici.
Fare clic con il pulsante destro del mouse sull'indice che si vuole disabilitare e selezionare Disabilita.
Nota
Se la tabella è aperta in modalità Progettazione, il controllo Disabilita non è disponibile. Per procedere, chiudere Progettazione tabelle e ricominciare.
Nella finestra di dialogo Disabilita indici verificare che nella griglia Indici da disabilitare sia presente l'indice corretto e fare clic su OK.
Disabilitare tutti gli indici di una tabella
In Esplora oggetti fare clic sul segno di addizione per espandere il database contenente la tabella in cui si desidera disabilitare gli indici.
Selezionare il segno di addizione per espandere la cartella Tabelle.
Fare clic sul segno di addizione per espandere la tabella in cui si desidera disabilitare gli indici.
Fare clic con il pulsante destro del mouse sulla cartella Indici e selezionare Disabilita tutti.
Nella finestra di dialogo Disabilita indici verificare che nella griglia Indici da disabilitare siano presenti gli indici corretti e fare clic su OK. Per rimuovere un indice dalla griglia Indici da disabilitare, selezionare l'indice desiderato, quindi premere il tasto CANC.
Le informazioni seguenti sono disponibili nella finestra di dialogo Disabilita indici :
Index Name
Consente di visualizzare il nome dell'indice. Durante l'esecuzione, in questa colonna viene anche visualizzata un'icona che ne indica lo stato.
Nome tabella
Visualizza il nome della tabella o della vista in cui l'indice è stato creato.
Tipo di indice
Visualizza il tipo di indice: Cluster, Non cluster, Spazialeo XML.
Stato
Visualizza lo stato dell'operazione di disabilitazione. I valori possibili al termine dell'esecuzione sono:
Spazio vuoto
Prima dell'esecuzione, lo stato è vuoto.
In corso
L'operazione di disabilitazione degli indici è stata avviata ma non ancora completata.
Success
L'operazione di disabilitazione è stata completata.
Errore
Si è verificato un errore durante la disabilitazione degli indici e non è stato possibile completare correttamente l'operazione.
Arrestato
La disabilitazione dell'indice non è stata completata poiché l'operazione è stata arrestata dall'utente.
Messaggio
Visualizza il testo dei messaggi di errore generati durante l'operazione. Durante l'esecuzione dell'operazione, gli errori vengono visualizzati come collegamenti ipertestuali. Nel testo di tali collegamenti è descritto l'errore verificatosi. La colonna Messaggio in genere non è sufficientemente ampia per contenere il testo completo del messaggio. Per leggere il messaggio completo, eseguire una delle seguenti operazioni:
- Spostare il puntatore del mouse sulla cella del messaggio per visualizzare un tooltip contenente il testo dell'errore.
- Fare clic sul collegamento ipertestuale per visualizzare una finestra di dialogo contenente l'errore completo.
Usare Transact-SQL
Gli esempi di codice Transact-SQL in questo articolo utilizzano il database campione AdventureWorks2022
o AdventureWorksDW2022
, che è possibile scaricare dalla home page di Esempi di Microsoft SQL Server e progetti collettivi.
Disabilitare un indice
In Esplora oggetti connettersi a un'istanza del motore di database.
Sulla barra Standard selezionare Nuova query.
Copiare e incollare l'esempio seguente nella finestra di query e selezionare Esegui. In questo esempio viene disabilitato l'indice
IX_Employee_OrganizationLevel_OrganizationNode
nella tabellaHumanResources.Employee
.USE AdventureWorks2022; GO ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee DISABLE;
Disabilitare tutti gli indici di una tabella
In Esplora oggetti connettersi a un'istanza del motore di database.
Sulla barra Standard selezionare Nuova query.
Copiare e incollare l'esempio seguente nella finestra di query e selezionare Esegui. In questo esempio vengono disabilitati tutti gli indici della tabella
HumanResources.Employee
.USE AdventureWorks2022; GO ALTER INDEX ALL ON HumanResources.Employee DISABLE;