Disabilitare indici e vincoli

Si applica a:SQL ServerAzure SQL DatabaseIstanza 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 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.

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

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

  2. Selezionare il segno di addizione per espandere la cartella Tabelle.

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

  4. Fare clic sul segno di addizione 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.

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

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

  2. Selezionare il segno di addizione per espandere la cartella Tabelle.

  3. Fare clic sul segno di addizione 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, 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

Questo articolo richiede il AdventureWorks2022 database di esempio AdventureWorks, che è possibile scaricare dalla home page del sito relativo a progetti della community ed esempi per Microsoft SQL Server.

Disabilitare un indice

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

  2. Sulla barra Standard selezionare Nuova query.

  3. 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 tabella HumanResources.Employee.

    USE AdventureWorks2022;
    GO
    
    ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode
        ON HumanResources.Employee
    DISABLE;
    

Disabilitare tutti gli indici di una tabella

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

  2. Sulla barra Standard selezionare Nuova query.

  3. 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;