DROP INDEX (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di strumenti analitici (PDW)

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, usare ALTER TABLE con la clausola DROP CONSTRAINT.

Importante

La sintassi definita in <drop_backward_compatible_index> verrà rimossa in una versione futura 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_or_spatial_index>. Gli indici XML non possono essere eliminati utilizzando la sintassi compatibile con le versioni precedenti.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

-- Syntax for SQL Server (All options except filegroup and filestream apply to Azure SQL Database.)  
  
DROP INDEX [ IF EXISTS ]   
{ <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.table_or_view_name | schema_name.table_or_view_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" } ]  
}  
-- Syntax for Azure SQL Database  
  
DROP INDEX  
{ <drop_relational_or_xml_or_spatial_index> [ ,...n ]   
}  
  
<drop_relational_or_xml_or_spatial_index> ::=   
    index_name ON <object>  
  
<object> ::=   
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
DROP INDEX index_name ON { database_name.schema_name.table_name | schema_name.table_name | table_name }  
[;]  

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Argomenti

IF EXISTS
Si applica a: SQL Server ( SQL Server 2016 (13.x) fino alla versione corrente).

Rimuove in modo condizionale l'indice solo se esiste già.

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 della vista associata all'indice. Gli indici spaziali sono supportati solo nelle tabelle.

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

Il database SQL di Azure supporta il formato del nome in tre parti, nome_database.[nome_schema].nome_oggetto, quando nome_database è il database corrente oppure nome_database è tempdb e nome_oggetto inizia con #.

<drop_clustered_index_option>
Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL.

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

MAXDOP = max_degree_of_parallelism
Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL (solo livelli di prestazioni P2 e P3).

Sostituisce l'opzione di configurazione max degree of parallelism per la durata dell'operazione sull'indice. Per altre informazioni, vedere Configurare l'opzione di configurazione del server max degree of parallelism. Utilizzare MAXDOP per limitare il numero di processori utilizzati durante l'esecuzione di un piano parallelo. Il valore massimo è 64 processori.

Importante

MAXDOP non è consentito per indici spaziali o XML.

max_degree_of_parallelism può essere:

1
Disattiva la generazione di piani paralleli.

>1
Limita il numero massimo di processori utilizzati in un'operazione parallela sull'indice in base al numero specificato.

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

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

Nota

Le operazioni parallele sugli indici non sono disponibili in tutte le edizioni di SQL Server. Per un elenco delle funzionalità supportate dalle varie edizioni di SQL Server, vedere Edizioni e funzionalità supportate di SQL Server 2017.

ONLINE = ON | OFF
Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL di Azure.

Specifica se le tabelle sottostanti e gli indici associati sono disponibili per le query e la modifica dei dati durante l'operazione sugli indici. Il valore predefinito è OFF.

In...
I blocchi di tabella a lungo termine non vengono mantenuti. Ciò consente il proseguimento delle query o degli aggiornamenti nella tabella sottostante.

OFF
Vengono applicati blocchi 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 altre informazioni, vedere la sezione Osservazioni.

Nota

Le operazioni online sugli indici non sono disponibili in tutte le edizioni di SQL Server. Per un elenco delle funzionalità supportate dalle varie edizioni di SQL Server, vedere Edizioni e funzionalità supportate di SQL Server 2017.

MOVE TO { partition_scheme_name(column_name) | filegroup_name | "default"
Si applica a: SQL Server 2008 (10.0.x) e versioni successive. Il database SQL supporta "default" come nome del filegroup.

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 questo deve essere già esistente. MOVE TO non può essere utilizzata per viste indicizzate o 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 di base 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 altre informazioni sull'allineamento degli indici partizionati, vedere Tabelle e indici partizionati.

partition_scheme_name(column_name)
Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL.

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 di colonna nello schema non è limitato alle colonne nella definizione dell'indice. È possibile specificare qualsiasi colonna nella tabella di base.

filegroup_name
Si applica a: SQL Server 2008 (10.0.x) e versioni successive.

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, come in MOVE TO "default" o MOVE TO [default]. Se si specifica "default", l'opzione QUOTED_IDENTIFIER deve essere impostata su ON per la sessione corrente. Si tratta dell'impostazione predefinita. Per altre informazioni, vedere SET QUOTED_IDENTIFIER (Transact-SQL).

FILESTREAM_ON { partition_scheme_name | filestream_filegroup_name | "default" }
Si applica a: SQL Server 2008 (10.0.x) e versioni successive.

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 verranno inclusi 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 una 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, come in MOVE TO "default" o MOVE TO [default]. Se si specifica "default", l'opzione QUOTED_IDENTIFIER deve essere impostata su ON per la sessione corrente. Si tratta dell'impostazione predefinita. Per altre 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.

Nota

Nella documentazione di SQL Server viene usato in modo generico il termine albero B in riferimento agli indici. Negli indici rowstore, SQL Server implementa un albero B+. Ciò non si applica a indici columnstore o ad archivi dati in memoria. Per altre informazioni, vedere Architettura e guida per la progettazione degli indici SQL Server e Azure SQL.

Non è possibile eliminare un indice se il filegroup in cui si trova è offline 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 è stata mantenuta per la compatibilità con le versioni precedenti. Non è possibile eliminare un indice XML o spaziale tramite la sintassi compatibile con le versioni precedenti.

Quando vengono eliminati indici con un numero di extent pari o superiore a 128, tramite il motore di database vengono posticipate le effettive deallocazioni delle pagine e i blocchi associati fino al termine del commit della transazione.

Talvolta gli indici vengono eliminati e ricreati per riorganizzare o ricompilare l'indice, ad esempio per applicare un nuovo fattore di riempimento o riorganizzare i dati dopo un'operazione di caricamento bulk. A tale scopo, l'uso di ALTER INDEX è più efficiente, soprattutto per gli indici cluster. Per ALTER INDEX REBUILD sono disponibili ottimizzazioni per impedire che gli indici non cluster vengano ricompilati.

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 online alla volta. Per una descrizione completa dell'opzione ONLINE, vedere CREATE INDEX (Transact-SQL).

Non è possibile eliminare un indice cluster online se l'indice è disabilitato in una vista o contiene 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.

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, creare un join tra sys.indexes e sys.tables su object_id. Per una query di esempio, vedere l'esempio D.

Nei computer multiprocessore che eseguono SQL Server 2005 Enterprise Edition o versione successiva, DROP INDEX può usare più processori per eseguire le operazioni di analisi e ordinamento associate all'eliminazione dell'indice cluster, proprio come le altre query. È possibile configurare manualmente il numero di processori utilizzati per eseguire l'istruzione DROP INDEX mediante l'opzione di indice MAXDOP. Per altre 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'istruzione ALTER TABLE ... RICOSTRUIRE... opzione che specifica l'opzione di compressione.

Quando un indice cluster viene eliminato offline, vengono rimossi solo i livelli superiori degli indici cluster, pertanto l'operazione è piuttosto veloce. Quando un indice cluster viene eliminato ONLINE, SQL Server ricompila l'heap due volte, una volta per l'operazione descritta nel passaggio 1 e una volta per quella descritta nel passaggio 2. Per altre informazioni sulla compressione dei dati, vedere Compressione dei dati.

Indici XML

Quando si elimina un indice XML non è possibile specificare opzioni né usare 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 altre informazioni, vedere Indici XML (SQL Server).

Indici spaziali

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

DROP INDEX spatial_index_name ON spatial_table_name;

Per altre informazioni sugli indici spaziali, vedere Panoramica degli indici spaziali.

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

R. Eliminazione di un indice

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

DROP INDEX IX_ProductVendor_BusinessEntityID   
    ON Purchasing.ProductVendor;  
GO  

B. Eliminazione di più indici

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

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

C. Eliminazione di un indice cluster online 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 viene archiviata nello stesso filegroup dell'indice. In questo esempio viene usato il database AdventureWorks2022

Si applica a: SQL Server 2008 (10.0.x) e versioni successive, database SQL.

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

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

Nell'esempio seguente viene eliminato un indice cluster online e la tabella risultante (heap) viene spostata nel filegroup NewGroup tramite la clausola MOVE TO . Vengono eseguite query sulle viste del catalogo sys.indexes, sys.tablese sys.filegroups per verificare la posizione dell'indice e della tabella nei filegroup prima e dopo lo spostamento. A partire da SQL Server 2016 (13.x) è possibile usare la sintassi DROP INDEX IF EXISTS.

Si applica a: SQL Server 2008 (10.0.x) e versioni successive.

--Create a clustered index on the PRIMARY filegroup if the index does not exist.  
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 AdventureWorks2022  
        ADD FILEGROUP NewGroup;  
    ALTER DATABASE AdventureWorks2022  
        ADD FILE (NAME = File1,  
            FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL13.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 online

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

-- 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);  

F. Eliminazione di un indice XML

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

DROP INDEX PXML_ProductModel_CatalogDescription   
    ON Production.ProductModel;  

G. Eliminazione di un indice cluster in una tabella FILESTREAM

Nell'esempio seguente viene eliminato un indice cluster online 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.

Si applica a: SQL Server 2008 (10.0.x) e versioni successive.

DROP INDEX PK_MyClusteredIndex   
    ON dbo.MyTable   
    WITH (MOVE TO MyPartitionScheme,  
          FILESTREAM_ON MyPartitionScheme);  
GO  

Vedi anche

ALTER INDEX (Transact-SQL)
ALTER PARTITION SCHEME (Transact-SQL)
ALTER TABLE (Transact-SQL)
CREATE INDEX (Transact-SQL)
CREATE PARTITION SCHEME (Transact-SQL)
CREATE SPATIAL INDEX (Transact-SQL)
CREATE XML INDEX (Transact-SQL)
EVENTDATA (Transact-SQL)
sys.indexes (Transact-SQL)
sys.tables (Transact-SQL)
sys.filegroups (Transact-SQL)
sp_spaceused (Transact-SQL)