Disabilitare indici e vincoli

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di Azure

Questo argomento 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.

Contenuto dell'articolo

Prima di iniziare

Limitazioni e restrizioni

  • In caso di disabilitazione, un 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 indicizzate 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 dopo quelli inclusi nella tabella cui viene fatto 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:

    • L'opzione AUTO_CREATE_STATISTICS è impostata su ON

    • 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.

Sicurezza

Autorizzazioni

Per eseguire l'istruzione ALTER INDEX, è necessario disporre almeno dell'autorizzazione ALTER per la tabella o la vista.

Utilizzo di SQL Server Management Studio

Per disabilitare un indice

  1. In Esplora oggetti fare clic sul segno più per espandere il database contenente la tabella in cui si desidera disabilitare un indice.

  2. Fare clic sul segno più per espandere la cartella Tabelle .

  3. Fare clic sul segno più per espandere la tabella in cui si desidera disabilitare un indice.

  4. Fare clic sul segno più per espandere la cartella Indici .

  5. 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.

  1. Nella finestra di dialogo Disabilita indici verificare che nella griglia Indici da disabilitare sia presente l'indice corretto e fare clic su OK.

Per disabilitare tutti gli indici di una tabella

  1. In Esplora oggetti fare clic sul segno più per espandere il database contenente la tabella in cui si desidera disabilitare gli indici.

  2. Fare clic sul segno più per espandere la cartella Tabelle .

  3. Fare clic sul segno più per espandere la tabella in cui si desidera disabilitare gli indici.

  4. Fare clic con il pulsante destro del mouse sulla cartella Indici e selezionare Disabilita tutti.

  5. 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 l'indicazione Stato è vuota.

  • 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.

Message
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 una descrizione comando contenente il testo dell'errore.

  • Fare clic sul collegamento ipertestuale per visualizzare una finestra di dialogo contenente l'errore completo.

Utilizzo di Transact-SQL

Per disabilitare un indice

  1. In Esplora oggetti connettersi a un'istanza del motore di database.

  2. Sulla barra Standard fare clic su Nuova query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.

    USE AdventureWorks2022;  
    GO  
    -- disables the IX_Employee_OrganizationLevel_OrganizationNode index  
    -- on the HumanResources.Employee table  
    ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee  
    DISABLE;  
    

Per disabilitare tutti gli indici di una tabella

  1. In Esplora oggetti connettersi a un'istanza del motore di database.

  2. Sulla barra Standard fare clic su Nuova query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.

    USE AdventureWorks2022;  
    GO  
    -- Disables all indexes on the HumanResources.Employee table.  
    ALTER INDEX ALL ON HumanResources.Employee  
    DISABLE;  
    

Per altre informazioni, vedere ALTER INDEX (Transact-SQL).