Disabilitazione di indici e vincoliDisable Indexes and Constraints

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2016)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

In questo argomento si descrive come disabilitare un indice o i vincoli in SQL Server 2017SQL Server 2017 tramite SQL Server Management StudioSQL Server Management Studio o Transact-SQLTransact-SQL.This topic describes how to disable an index or constraints in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. La disabilitazione di un indice impedisce all'utente di accedere all'indice e, per gli indici cluster, ai dati della tabella sottostante.Disabling an index prevents user access to the index, and for clustered indexes to the underlying table data. La definizione dell'indice viene mantenuta nei metadati e le statistiche relative all'indice vengono preservate negli indici non cluster.The index definition remains in metadata, and index statistics are kept on nonclustered indexes. La disabilitazione di un indice non cluster o cluster di una vista consente di eliminare fisicamente i dati dell'indice.Disabling a nonclustered or clustered index on a view physically deletes the index data. 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.Disabling a clustered index on a table prevents access to the data; the data still remains in the table, but is unavailable for data manipulation language (DML) operations until the index is dropped or rebuilt.

Contenuto dell'argomentoIn This Topic

Prima di iniziare Before You Begin

Limitazioni e restrizioni Limitations and Restrictions

  • In caso di disabilitazione, un indice non viene aggiornato.The index is not maintained while it is disabled.

  • In Query Optimizer l'indice disabilitato non viene considerato durante la creazione dei piani di esecuzione della query.The query optimizer does not consider the disabled index when creating query execution plans. Inoltre, le query che fanno riferimento all'indice disabilitato con un hint di tabella non vengono eseguite correttamente.Also, queries that reference the disabled index with a table hint fail.

  • Non è possibile creare un indice assegnandogli lo stesso nome di un indice disabilitato esistente.You cannot create an index that uses the same name as an existing disabled index.

  • Un indice disabilitato può essere eliminato.A disabled index can be dropped.

  • 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.When disabling a unique index, the PRIMARY KEY or UNIQUE constraint and all FOREIGN KEY constraints that reference the indexed columns from other tables are also disabled. Quando si disabilita un indice cluster, vengono disabilitati anche tutti i vincoli FOREIGN KEY in ingresso e in uscita nella tabella sottostante.When disabling a clustered index, all incoming and outgoing FOREIGN KEY constraints on the underlying table are also disabled. Quando viene disabilitato l'indice, i nomi dei vincoli vengono elencati in un messaggio di avviso.The constraint names are listed in a warning message when the index is disabled. Dopo aver ricompilato l'indice, è necessario abilitare manualmente tutti i vincoli utilizzando l'istruzione ALTER TABLE CHECK CONSTRAINT.After rebuilding the index, all constraints must be manually enabled by using the ALTER TABLE CHECK CONSTRAINT statement.

  • Gli indici non cluster vengono disabilitati automaticamente quando viene disabilitato l'indice cluster associatoNonclustered indexes are automatically disabled when the associated clustered index is disabled. e non possono essere abilitati fino all'abilitazione dell'indice cluster nella tabella o nella vista o all'eliminazione dell'indice cluster nella tabella.They cannot be enabled until either the clustered index on the table or view is enabled or the clustered index on the table is dropped. 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.Nonclustered indexes must be explicitly enabled, unless the clustered index was enabled by using the ALTER INDEX ALL REBUILD statement.

  • L'istruzione ALTER INDEX ALL REBUILD consente di ricompilare e abilitare tutti gli indici disabilitati nella tabella, ad eccezione degli indici disabilitati nelle viste.The ALTER INDEX ALL REBUILD statement rebuilds and enables all disabled indexes on the table, except for disabled indexes on views. Gli indici nelle viste devono essere abilitati in un'istruzione ALTER INDEX ALL REBUILD distinta.Indexes on views must be enabled in a separate ALTER INDEX ALL REBUILD statement.

  • 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.Disabling a clustered index on a table also disables all clustered and nonclustered indexes on views that reference that table. Questi indici devono essere ricompilati immediatamente dopo quelli inclusi nella tabella cui viene fatto riferimento.These indexes must be rebuilt just as those on the referenced table.

  • È possibile accedere alle righe di dati degli indici cluster disabilitati solo per eliminare o ricompilare l'indice cluster.The data rows of the disabled clustered index cannot be accessed except to drop or rebuild the clustered index.

  • È possibile ricompilare online un indice non cluster disabilitato quando nella tabella non è incluso un indice cluster disabilitato.You can rebuild a disabled nonclustered index online when the table does not have a disabled clustered index. Tuttavia, è sempre necessario ricompilare offline un indice cluster disabilitato se si utilizza l'istruzione ALTER INDEX REBUILD o CREATE INDEX WITH DROP_EXISTING.However, you must always rebuild a disabled clustered index offline if you use either the ALTER INDEX REBUILD or CREATE INDEX WITH DROP_EXISTING statement. Per altre informazioni sulle operazioni online sugli indici, vedere Eseguire operazioni online sugli indici.For more information about online index operations, see Perform Index Operations Online.

  • L'istruzione CREATE STATISTICS non può essere eseguita correttamente in una tabella in cui è incluso un indice cluster disabilitato.The CREATE STATISTICS statement cannot be successfully executed on a table that has a disabled clustered index.

  • L'opzione di database AUTO_CREATE_STATISTICS crea nuove statistiche per una colonna quando l'indice viene disabilitato e si verificano le condizioni seguenti:The AUTO_CREATE_STATISTICS database option creates new statistics on a column when the index is disabled and the following conditions exist:

    • L'opzione AUTO_CREATE_STATISTICS è impostata su ONAUTO_CREATE_STATISTICS is set to ON

    • Non è disponibile alcuna statistica esistente per la colonna.There are no existing statistics for the column.

    • Le statistiche sono necessarie durante l'ottimizzazione delle query.Statistics are required during query optimization.

  • 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.If a clustered index is disabled, DBCC CHECKDB cannot return information about the underlying table; instead, the statement reports that the clustered index is disabled. 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.DBCC INDEXDEFRAG cannot be used to defragment a disabled index; the statement fails with an error message. Per ricompilare un indice disabilitato, è possibile utilizzare l'istruzione DBCC DBREINDEX .You can use DBCC DBREINDEX to rebuild a disabled index.

  • La creazione di un nuovo indice cluster comporta l'abilitazione degli indici non cluster disabilitati precedentemente.Creating a new clustered index enables previously disabled nonclustered indexes. Per altre informazioni, vedere Enable Indexes and Constraints.For more information, see Enable Indexes and Constraints.

Sicurezza Security

Autorizzazioni Permissions

Per eseguire l'istruzione ALTER INDEX, è necessario disporre almeno dell'autorizzazione ALTER per la tabella o la vista.To execute ALTER INDEX, at a minimum, ALTER permission on the table or view is required.

Utilizzo di SQL Server Management Studio Using SQL Server Management Studio

Per disabilitare un indiceTo disable an index

  1. In Esplora oggetti fare clic sul segno più per espandere il database contenente la tabella in cui si desidera disabilitare un indice.In Object Explorer, click the plus sign to expand the database that contains the table on which you want to disable an index.

  2. Fare clic sul segno più per espandere la cartella Tabelle .Click the plus sign to expand the Tables folder.

  3. Fare clic sul segno più per espandere la tabella in cui si desidera disabilitare un indice.Click the plus sign to expand the table on which you want to disable an index.

  4. Fare clic sul segno più per espandere la cartella Indici .Click the plus sign to expand the Indexes folder.

  5. Fare clic con il pulsante destro del mouse sull'indice che si vuole disabilitare e selezionare Disabilita.Right-click the index you want to disable and select Disable.

  6. Nella finestra di dialogo Disabilita indici verificare che nella griglia Indici da disabilitare sia presente l'indice corretto e fare clic su OK.In the Disable Indexes dialog box, verify that the correct index is in the Indexes to disable grid and click OK.

Per disabilitare tutti gli indici di una tabellaTo disable all indexes on a table

  1. In Esplora oggetti fare clic sul segno più per espandere il database contenente la tabella in cui si desidera disabilitare gli indici.In Object Explorer, click the plus sign to expand the database that contains the table on which you want to disable the indexes.

  2. Fare clic sul segno più per espandere la cartella Tabelle .Click the plus sign to expand the Tables folder.

  3. Fare clic sul segno più per espandere la tabella in cui si desidera disabilitare gli indici.Click the plus sign to expand the table on which you want to disable the indexes.

  4. Fare clic con il pulsante destro del mouse sulla cartella Indici e selezionare Disabilita tutti.Right-click the Indexes folder and select Disable All.

  5. Nella finestra di dialogo Disabilita indici verificare che nella griglia Indici da disabilitare siano presenti gli indici corretti e fare clic su OK.In the Disable Indexes dialog box, verify that the correct indexes are in the Indexes to disable grid and click OK. Per rimuovere un indice dalla griglia Indici da disabilitare , selezionare l'indice desiderato, quindi premere il tasto CANC.To remove an index from the Indexes to disable grid, select the index and then press the Delete key.

    Le informazioni seguenti sono disponibili nella finestra di dialogo Disabilita indici :The following information is available in the Disable Indexes dialog box:

    Index NameIndex Name
    Consente di visualizzare il nome dell'indice.Displays the name of the index. Durante l'esecuzione, in questa colonna viene anche visualizzata un'icona che ne indica lo stato.During execution, this column also displays an icon representing the status.

    Nome tabellaTable Name
    Visualizza il nome della tabella o della vista in cui l'indice è stato creato.Displays the name of the table or view that the index was created on.

    Tipo di indiceIndex Type
    Visualizza il tipo di indice: Cluster, Non cluster, Spazialeo XML.Displays the type of the index: Clustered, Nonclustered, Spatial, or XML.

    StatoStatus
    Visualizza lo stato dell'operazione di disabilitazione.Displays the status of the disable operation. I valori possibili al termine dell'esecuzione sono:Possible values after execution are:

  • VuotoBlank

    Prima dell'esecuzione l'indicazione Stato è vuota.Prior to execution Status is blank.

  • In corsoIn progress

    L'operazione di disabilitazione degli indici è stata avviata ma non ancora completata.Disabling of the indexes has been started but is not complete.

  • Operazione completataSuccess

    L'operazione di disabilitazione è stata completata.The disable operation completed successfully.

  • ErroreError

    Si è verificato un errore durante la disabilitazione degli indici e non è stato possibile completare correttamente l'operazione.An error was encountered during the index disable operation, and the operation did not complete successfully.

  • StoppedStopped

    La disabilitazione dell'indice non è stata completata poiché l'operazione è stata arrestata dall'utente.The disable of the index was not completed successfully because the user stopped the operation.

    MessageMessage
    Visualizza il testo dei messaggi di errore generati durante l'operazione.Provides the text of error messages during the disable operation. Durante l'esecuzione dell'operazione, gli errori vengono visualizzati come collegamenti ipertestuali.During execution, errors appear as hyperlinks. Nel testo di tali collegamenti è descritto l'errore verificatosi.The text of the hyperlinks describes the body of the error. La colonna Messaggio in genere non è sufficientemente ampia per contenere il testo completo del messaggio.The Message column is rarely wide enough to read the full message text. Per leggere il messaggio completo, eseguire una delle seguenti operazioni:There are two ways to get the full text:

  • Spostare il puntatore del mouse sulla cella del messaggio per visualizzare una descrizione comando contenente il testo dell'errore.Move the mouse pointer over the message cell to display a ToolTip with the error text.

  • Fare clic sul collegamento ipertestuale per visualizzare una finestra di dialogo contenente l'errore completo.Click the hyperlink to display a dialog box displaying the full error.

Utilizzo di Transact-SQL Using Transact-SQL

Per disabilitare un indiceTo disable an index

  1. In Esplora oggetticonnettersi a un'istanza del Motore di databaseDatabase Engine.In Object Explorer, connect to an instance of Motore di databaseDatabase Engine.

  2. Sulla barra Standard fare clic su Nuova query.On the Standard bar, click New Query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and click Execute.

    USE AdventureWorks2012;  
    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 tabellaTo disable all indexes on a table

  1. In Esplora oggetticonnettersi a un'istanza del Motore di databaseDatabase Engine.In Object Explorer, connect to an instance of Motore di databaseDatabase Engine.

  2. Sulla barra Standard fare clic su Nuova query.On the Standard bar, click New Query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and click Execute.

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

    Per altre informazioni, vedere ALTER INDEX (Transact-SQL).For more information, see ALTER INDEX (Transact-SQL).