DROP INDEX (Transact-SQL)

ms176118.note(it-it,SQL.90).gifImportante:
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 XML relazionali dal database corrente. In SQL Server 2005, è 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, utilizare ALTER TABLE con la clausola DROP CONSTRAINT.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

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

<drop_relational_or_xml_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" 
            }
}

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

    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 a indici paralleli.

    [!NOTA] Le operazioni parallele sugli indici sono supportate solo in SQL Server 2005 Enterprise Edition.

  • 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 in SQL Server 2005 Enterprise Edition.

  • MOVE TO
    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 è 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 (struttura b-tree) 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 index_name ON { table_or_view_name } è nuova in SQL Server 2005. La sintassi table_or_view_name**.**index_name è supportata per compatibilità con le versioni precedenti. Se si utilizzano entrambe le opzioni in una singola transazione, l'istruzione non verrà eseguita correttamente. Non è possibile eliminare un indice XML tramite la sintassi compatibile con le versioni precedenti.

Quando vengono eliminati gli indici con 128 o più extent, Motore di database di SQL Server 2005 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 di massa. 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, in SQL Server 2005 è 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.

Su computer multiprocessore in cui è in esecuzione SQL Server 2005 Enterprise Edition, l'istruzione DROP INDEX può utilizzare più processori per eseguire le operazioni di scansione e di ordinamento associate all'eliminazione dell'indice cluster, allo stesso modo di quanto avviene per altre query. È possibile configurare manualmente il numero di processori utilizzati per eseguire l'istruzione DROP INDEX specificando l'opzione di indice MAXDOP. Per ulteriori informazioni, vedere Configurazione di operazioni a indici paralleli.

Indici XML

Le opzioni non possono essere specificate quando si elimina un indice XML. Quando viene eliminato un indice XML primario, tutti gli indici XML secondari associati vengono eliminati automaticamente. Per ulteriori informazioni, vedere Indici nelle colonne con tipo di dati XML.

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 AdventureWorks;
GO
DROP INDEX IX_ProductVendor_VendorID 
    ON Purchasing.ProductVendor;
GO

B. Eliminazione di più indici

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

USE AdventureWorks;
GO
DROP INDEX
    IX_PurchaseOrderHeader_EmployeeID ON Purchasing.PurchaseOrderHeader,
    IX_VendorAddress_AddressID ON Purchasing.VendorAddress;
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.

USE AdventureWorks;
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 AdventureWorks;
GO
--Create a clustered index on the PRIMARY filegroup if it 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.
-- Get the SQL Server data path
DECLARE @data_path nvarchar(256);
SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
                  FROM master.sys.master_files
                  WHERE database_id = 1 AND file_id = 1);

-- execute the ALTER DATABASE statement 
IF NOT EXISTS (SELECT name FROM sys.filegroups
                WHERE name = N'NewGroup')
    BEGIN
    ALTER DATABASE AdventureWorks
        ADD FILEGROUP NewGroup;
    EXECUTE ('ALTER DATABASE AdventureWorks
        ADD FILE (NAME = File1,
            FILENAME = '''+ @data_path + '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 AdventureWorks;
GO
-- Set ONLINE = OFF to execute this example on editions other than Enterprise Edition.
ALTER TABLE Production.ProductCostHistory
    DROP CONSTRAINT PK_ProductCostHistory_ProductID_StartDate
        WITH (ONLINE = ON);
GO

F. Eliminazione di un indice XML

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

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

Vedere anche

Riferimento

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

Altre risorse

Individuazione dei requisiti di spazio su disco per gli indici
Eliminazione di indici

Guida in linea e informazioni

Assistenza su SQL Server 2005