DROP INDEX (Transact-SQL)

Nota importanteImportante

La sintassi definita in <drop_backward_compatible_index> verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server. Evitare pertanto di utilizzarla in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata. Utilizzare in alternativa la sintassi specificata in <drop_relational_or_xml_index>. Gli indici XML non possono essere eliminati utilizzando la sintassi compatibile con le versioni precedenti.

Rimuove uno o più indici relazionali, spaziali, filtrati o XML dal database corrente. È possibile eliminare un indice cluster e spostare la tabella risultante in un altro filegroup o schema di partizione in una singola transazione specificando l'opzione MOVE TO.

L'istruzione DROP INDEX non è valida per gli indici creati tramite i vincoli PRIMARY KEY o UNIQUE. Per rimuovere il vincolo e l'indice corrispondente, utilizzare ALTER TABLE con la clausola DROP CONSTRAINT.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

DROP INDEX
{ <drop_relational_or_xml_or_spatial_index> [ ,...n ] 
| <drop_backward_compatible_index> [ ,...n ]
}

<drop_relational_or_xml_or_spatial_index> ::=
        index_name ON <object> 
    [ WITH ( <drop_clustered_index_option> [ ,...n ] ) ]

<drop_backward_compatible_index> ::=
    [ owner_name. ] table_or_view_name.index_name

<object> ::=
{
    [ database_name. [ schema_name ] . | schema_name. ] 
        table_or_view_name
}

<drop_clustered_index_option> ::=
{
    MAXDOP = max_degree_of_parallelism
    | ONLINE = { ON | OFF }
  | MOVE TO { partition_scheme_name ( column_name ) 
            | filegroup_name
            | "default" 
            }
  [ FILESTREAM_ON { partition_scheme_name 
            | filestream_filegroup_name 
            | "default" } ]
}

Argomenti

  • index_name
    Nome dell'indice che si desidera eliminare.

  • database_name
    Nome del database.

  • schema_name
    Nome dello schema a cui appartiene la tabella o la vista.

  • table_or_view_name
    Nome della tabella o vista associata all'indice. Gli indici spaziali sono supportati solo nelle tabelle.

    Per visualizzare un report degli indici di un oggetto, utilizzare la vista del catalogo sys.indexes.

  • <drop_clustered_index_option>
    Controlla le opzioni degli indici cluster. Non è possibile utilizzare queste opzioni con altri tipi di indice.

  • MAXDOP = max_degree_of_parallelism
    Ignora l'opzione di configurazione max degree of parallelism per la durata dell'operazione sull'indice. Per ulteriori informazioni, vedere Opzione max degree of parallelism. Utilizzare MAXDOP per limitare il numero di processori utilizzati in una esecuzione di piani paralleli. Il valore massimo è 64 processori.

    Nota importanteImportante

    MAXDOP non è consentito per indici spaziali o XML.

    I possibili valori per max_degree_of_parallelism sono i seguenti:

    • 1
      Disattiva la generazione di piani paralleli.

    • >1
      Limita il numero massimo di processori utilizzati in una operazione parallela sugli indici al numero specificato.

    • 0 (valore predefinito)
      Utilizza il numero effettivo di processori o un numero inferiore in base al carico di lavoro corrente del sistema.

    Per ulteriori informazioni, vedere Configurazione di operazioni parallele sugli indici.

    Nota

    Le operazioni parallele sugli indici sono disponibili solo nelle edizioni Enterprise, Developer ed Evaluation di SQL Server.

  • ONLINE = ON | OFF
    Specifica se le tabelle sottostanti e gli indici associati sono disponibili per le query e per modifiche dei dati durante l'operazione sull'indice. Il valore predefinito è OFF.

    • ON
      I blocchi di lunga durata a livello di tabella non vengono mantenuti. Ciò consente il proseguimento delle query o degli aggiornamenti nella tabella sottostante.

    • OFF
      Vengono applicati blocchi a livello di tabella e la tabella non è disponibile per la durata dell'operazione sull'indice.

    L'opzione ONLINE può essere specificata solo quando si eliminano gli indici cluster. Per ulteriori informazioni, vedere la sezione Osservazioni.

    Nota

    Le operazioni sugli indici in linea sono disponibili solo nelle edizioni Enterprise, Developer ed Evaluation di SQL Server.

  • MOVE TO { partition_scheme_name**(column_name)** | filegroup_name | "default"
    Specifica una posizione in cui spostare le righe dei dati attualmente nel livello foglia dell'indice cluster. I dati vengono spostati nella nuova posizione sotto forma di heap. È possibile specificare come nuova posizione uno schema di partizione o un filegroup, ma questi devono essere già esistenti. MOVE TO non è valido per le viste indicizzate o per gli indici non cluster. Se uno schema di partizione o filegroup non viene specificato, la tabella risultante si troverà nello stesso schema di partizione o filegroup definito per l'indice cluster.

    Se un indice cluster viene eliminato tramite MOVE TO, tutti gli indici non cluster nella tabella del database vengono ricostruiti, ma rimangono nei filegroup o negli schemi di partizione originali. Se la tabella di base viene spostata in un filegroup o in uno schema di partizione diverso, gli indici non cluster non vengono spostati in base alla nuova posizione della tabella di base (heap). Pertanto, anche se in precedenza gli indici non cluster erano allineati con gli indici cluster, potrebbero non essere più allineati con l'heap. Per ulteriori informazioni sull'allineamento degli indici partizionati, vedere Linee guida specifiche per gli indici partizionati.

    • partition_scheme_name**(column_name)**
      Specifica uno schema di partizione come posizione per la tabella risultante. È necessario che lo schema di partizione sia già stato creato tramite CREATE PARTITION SCHEME o ALTER PARTITION SCHEME. Se non viene specificata alcuna posizione e la tabella è partizionata, la tabella viene inclusa nello stesso schema di partizione dell'indice cluster esistente.

      Il nome della colonna nello schema non è limitato alle colonne nella definizione dell'indice. È possibile specificare qualsiasi colonna nella tabella di base.

    • filegroup_name
      Specifica un filegroup come posizione per la tabella risultante. Se non viene specificata una posizione e la tabella non è partizionata, la tabella risultante viene inclusa nello stesso filegroup dell'indice cluster. Il filegroup deve essere già esistente.

    • "default"
      Specifica la posizione predefinita per la tabella risultante.

      Nota

      In questo contesto, default non è una parola chiave, ma un identificatore per il filegroup predefinito e deve essere delimitato, ad esempio MOVE TO "default" oppure MOVE TO [default]. Se si specifica "default", l'opzione QUOTED_IDENTIFIER deve essere impostata su ON per la sessione corrente. Questa impostazione è quella predefinita. Per ulteriori informazioni, vedere SET QUOTED_IDENTIFIER (Transact-SQL).

  • FILESTREAM_ON { partition_scheme_name | filestream_filegroup_name | "default" }
    Specifica una posizione in cui spostare la tabella FILESTREAM che attualmente si trova al livello foglia dell'indice cluster. I dati vengono spostati nella nuova posizione sotto forma di heap. È possibile specificare come nuova posizione uno schema di partizione o un filegroup, ma questo deve essere già esistente. FILESTREAM ON non è valido per viste indicizzate o indici non cluster. Se non viene specificato uno schema di partizione, i dati si troveranno nello stesso schema di partizione definito per l'indice cluster.

    • partition_scheme_name
      Specifica uno schema di partizione per i dati FILESTREAM. È necessario che lo schema di partizione sia già stato creato tramite CREATE PARTITION SCHEME o ALTER PARTITION SCHEME. Se non viene specificata alcuna posizione e la tabella è partizionata, la tabella viene inclusa nello stesso schema di partizione dell'indice cluster esistente.

      Se si specifica un schema di partizione per MOVE TO, è necessario utilizzare lo stesso schema di partizione per FILESTREAM ON.

    • filestream_filegroup_name
      Specifica un filegroup FILESTREAM per i dati FILESTREAM. Se non viene specificata alcuna posizione e la tabella non è partizionata, i dati vengono inclusi nel filegroup FILESTREAM predefinito.

    • "default"
      Specifica la posizione predefinita dei dati FILESTREAM.

      Nota

      In questo contesto, default non è una parola chiave, ma un identificatore per il filegroup predefinito e deve essere delimitato, ad esempio MOVE TO "default" oppure MOVE TO [default]. Se si specifica "default", l'opzione QUOTED_IDENTIFIER deve essere impostata su ON per la sessione corrente. Questa è l'impostazione predefinita. Per ulteriori informazioni, vedere SET QUOTED_IDENTIFIER (Transact-SQL).

Osservazioni

Quando si elimina un indice non cluster, la definizione dell'indice viene rimossa dai metadati e le pagine dei dati dell'indice (albero B) vengono rimosse dai file del database. Quando viene eliminato un indice cluster, la definizione dell'indice viene rimossa dai metadati e le righe di dati precedentemente archiviate nel livello foglia dell'indice cluster vengono archiviate nella tabella non ordinata risultante, o heap. Tutto lo spazio occupato in precedenza dall'indice viene recuperato, e può essere quindi utilizzato per qualsiasi oggetto di database.

Non è possibile eliminare un indice se il filegroup in cui si trova non è in linea oppure è in sola lettura.

Quando si elimina l'indice cluster di una vista indicizzata, tutte le statistiche create automaticamente e tutti gli indici non cluster della stessa vista vengono eliminati automaticamente. Le statistiche create manualmente non vengono eliminate.

La sintassi table_or_view_name**.**index_name è supportata per compatibilità con le versioni precedenti. Non è possibile eliminare un indice XML o spaziale tramite la sintassi compatibile con le versioni precedenti.

Quando vengono eliminati gli indici con 128 o più extent, Motore di database posticipa le deallocazioni effettive delle pagine e dei relativi blocchi associati fino al termine dell'esecuzione del commit della transazione. Per ulteriori informazioni, vedere Eliminazione e ricostruzione di oggetti di grandi dimensioni.

Talvolta gli indici vengono eliminati e ricreati per riorganizzare o ricostruire l'indice, ad esempio per applicare un nuovo fattore di riempimento o riorganizzare i dati dopo un'operazione di caricamento bulk. Per eseguire questa operazione, l'utilizzo di ALTER INDEX risulta più efficace, specialmente per gli indici cluster. Per ALTER INDEX REBUILD sono disponibili ottimizzazioni per impedire che gli indici non cluster vengano ricostruiti.

Utilizzo delle opzioni con DROP INDEX

Quando si elimina un indice cluster, è possibile impostare le opzioni di indice MAXDOP, ONLINE e MOVE TO.

Utilizzare l'opzione MOVE TO per eliminare l'indice cluster e spostare la tabella risultante in un altro filegroup o schema di partizione in una singola transazione.

Quando si specifica ONLINE = ON, le query e le modifiche ai dati sottostanti e agli indici non cluster associati non vengono bloccate dalla transazione DROP INDEX. È possibile eliminare un solo indice cluster in linea alla volta. Per una descrizione completa dell'opzione ONLINE, vedere CREATE INDEX (Transact-SQL).

Non è possibile eliminare un indice cluster in linea se l'indice è disattivato in una vista o include colonne di tipo text, ntext, image, varchar(max), nvarchar(max), varbinary(max) o xml nelle righe di dati a livello foglia.

Per l'utilizzo delle opzioni ONLINE = ON e MOVE TO è necessario spazio su disco temporaneo aggiuntivo. Per ulteriori informazioni, vedere Individuazione dei requisiti di spazio su disco per gli indici.

Dopo aver eliminato un indice, l'heap risultante viene visualizzato nella vista del catalogo sys.indexes con un valore NULL nella colonna name. Per visualizzare il nome della tabella, unire in join sys.indexes e sys.tables su object_id. Per una query di esempio, vedere l'esempio D.

Nei computer multiprocessore in cui è in esecuzione SQL Server 2005 Enterprise Edition o versione successiva l'istruzione DROP INDEX, allo stesso modo di altre query, può utilizzare più processori per eseguire le operazioni di analisi e di ordinamento associate all'eliminazione dell'indice cluster. È possibile configurare manualmente il numero di processori utilizzati per eseguire l'istruzione DROP INDEX mediante l'opzione di indice MAXDOP. Per ulteriori informazioni, vedere Configurazione di operazioni parallele sugli indici.

Quando un indice cluster viene eliminato, le partizioni di heap corrispondenti mantengono l'impostazione di compressione dei dati a meno che lo schema di partizione non venga modificato. In tal caso, tutte le partizioni vengono ricostruite in un stato non compresso (DATA_COMPRESSION = NONE). Per eliminare un indice cluster e modificare lo schema di partizione, sono necessari i due passaggi seguenti:

  1. Eliminare l'indice cluster.

  2. Modificare la tabella utilizzando un'opzione ALTER TABLE ... REBUILD... specificando l'opzione di compressione.

Quando un indice cluster viene eliminato non in linea, vengono rimossi solo i livelli superiori degli indici cluster, pertanto l'operazione è piuttosto veloce. Quando un indice cluster viene eliminato in linea, SQL Server ricostruisce l'heap due volte, una volta per il passaggio 1 e una volta per il passaggio 2. Per ulteriori informazioni sulla compressione dei dati, vedere Creazione di tabelle e di indici compressi.

Indici XML

Le opzioni non possono essere specificate quando si elimina un indice XML. Non è inoltre possibile utilizzare la sintassi table_or_view_name**.**index_name. Quando viene eliminato un indice XML primario, tutti gli indici XML secondari associati vengono eliminati automaticamente. Per ulteriori informazioni, vedere Indici su colonne con tipo di dati XML.

Indici spaziali

Gli indici spaziali sono supportati solo nelle tabelle. Quando si elimina un indice spaziale, non è possibile specificare alcuna opzione o utilizzare **.**index_name. La sintassi corretta è la seguente:

DROP INDEX spatial_index_name ON spatial_table_name;

Per ulteriori informazioni sugli indici spaziali, vedere Utilizzo degli indici spaziali (Motore di database).

Autorizzazioni

Per eseguire DROP INDEX è necessario disporre almeno dell'autorizzazione ALTER sulla tabella o sulla vista. Questa autorizzazione viene concessa per impostazione predefinita al ruolo predefinito del server sysadmin e ai ruoli predefiniti del database db_ddladmin e db_owner.

Esempi

A. Eliminazione di un indice

Nell'esempio seguente viene eliminato l'indice IX_ProductVendor_VendorID nella tabella ProductVendor.

USE AdventureWorks2008R2;
GO
DROP INDEX IX_ProductVendor_BusinessEntityID 
    ON Purchasing.ProductVendor;
GO

B. Eliminazione di più indici

Nell'esempio seguente vengono eliminati due indici in una transazione singola.

USE AdventureWorks2008R2;
GO
DROP INDEX
    IX_PurchaseOrderHeader_EmployeeID ON Purchasing.PurchaseOrderHeader,
    IX_Address_StateProvinceID ON Person.Address;
GO

C. Eliminazione di un indice cluster in linea e impostazione dell'opzione MAXDOP

Nell'esempio seguente viene eliminato un indice cluster con l'opzione ONLINE impostata su ON e l'opzione MAXDOP impostata su 8. Poiché l'opzione MOVE TO non è stata specificata, la tabella risultante è archiviata nello stesso filegroup dell'indice.

Nota

Questo esempio può essere eseguito solo in SQL Server 2005 Enterprise Edition o versione successiva.

USE AdventureWorks2008R2;
GO
DROP INDEX AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate 
    ON Production.BillOfMaterials WITH (ONLINE = ON, MAXDOP = 2);
GO

D. Eliminazione di un indice cluster in linea e spostamento di una tabella in un nuovo filegroup

Nell'esempio seguente viene eliminato un indice cluster in linea e la tabella risultante (heap) viene spostata nel filegroup NewGroup tramite la clausola MOVE TO. Vengono eseguite delle query sulle viste del catalogo sys.indexes, sys.tables e sys.filegroups per verificare il posizionamento dell'indice e della tabella nei filegroup prima e dopo lo spostamento.

USE AdventureWorks2008R2;
GO
--Create a clustered index on the PRIMARY filegroup if the index does not exist.
IF NOT EXISTS (SELECT name FROM sys.indexes WHERE name = 
            N'AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate')
    CREATE UNIQUE CLUSTERED INDEX
        AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate 
    ON Production.BillOfMaterials (ProductAssemblyID, ComponentID, 
        StartDate)
    ON 'PRIMARY';
GO
-- Verify filegroup location of the clustered index.
SELECT t.name AS [Table Name], i.name AS [Index Name], i.type_desc,
    i.data_space_id, f.name AS [Filegroup Name]
FROM sys.indexes AS i
    JOIN sys.filegroups AS f ON i.data_space_id = f.data_space_id
    JOIN sys.tables as t ON i.object_id = t.object_id
        AND i.object_id = OBJECT_ID(N'Production.BillOfMaterials','U')
GO
--Create filegroup NewGroup if it does not exist.
IF NOT EXISTS (SELECT name FROM sys.filegroups
                WHERE name = N'NewGroup')
    BEGIN
    ALTER DATABASE AdventureWorks2008R2
        ADD FILEGROUP NewGroup;
    ALTER DATABASE AdventureWorks2008R2
        ADD FILE (NAME = File1,
            FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\File1.ndf')
        TO FILEGROUP NewGroup;
    END
GO
--Verify new filegroup
SELECT * from sys.filegroups;
GO
-- Drop the clustered index and move the BillOfMaterials table to
-- the Newgroup filegroup.
-- Set ONLINE = OFF to execute this example on editions other than Enterprise Edition.
DROP INDEX AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate 
    ON Production.BillOfMaterials 
    WITH (ONLINE = ON, MOVE TO NewGroup);
GO
-- Verify filegroup location of the moved table.
SELECT t.name AS [Table Name], i.name AS [Index Name], i.type_desc,
    i.data_space_id, f.name AS [Filegroup Name]
FROM sys.indexes AS i
    JOIN sys.filegroups AS f ON i.data_space_id = f.data_space_id
    JOIN sys.tables as t ON i.object_id = t.object_id
        AND i.object_id = OBJECT_ID(N'Production.BillOfMaterials','U');
GO

E. Eliminazione di un vincolo PRIMARY KEY in linea

Gli indici creati come risultato della creazione dei vincoli PRIMARY KEY o UNIQUE non possono essere eliminati tramite DROP INDEX, ma vengono eliminati tramite l'istruzione ALTER TABLE DROP CONSTRAINT. Per ulteriori informazioni, vedere ALTER TABLE.

Nell'esempio seguente viene eliminato un indice cluster con un vincolo PRIMARY KEY eliminando il vincolo. La tabella ProductCostHistory non ha vincoli FOREIGN KEY. In caso contrario, sarebbe stato necessario rimuovere prima i vincoli.

USE AdventureWorks2008R2;
GO
-- Set ONLINE = OFF to execute this example on editions other than Enterprise Edition.
ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON);

GO

F. Eliminazione di un indice XML

Nell'esempio seguente viene eliminato un indice XML nella tabella ProductModel.

USE AdventureWorks2008R2;
GO
DROP INDEX PXML_ProductModel_CatalogDescription 
    ON Production.ProductModel;
GO

G. Eliminazione di un indice cluster in una tabella FILESTREAM

Nell'esempio seguente viene eliminato un indice cluster in linea e la tabella risultante (heap) e i dati FILESTREAM vengono spostati nello schema di partizione MyPartitionScheme utilizzando sia la clausola MOVE TO che la clausola FILESTREAM ON.

USE MyDatabase;
GO
DROP INDEX PK_MyClusteredIndex 
    ON dbo.MyTable 
    MOVE TO MyPartitionScheme
    FILESTREAM_ON MyPartitionScheme;
GO