DROP INDEX (Transact-SQL)

ms176118.note(de-de,SQL.90).gifWichtig:
Die in <drop_backward_compatible_index> definierte Syntax wird in einer zukünftigen Version von Microsoft SQL Server entfernt. Vermeiden Sie die Verwendung dieser Syntax bei neuen Entwicklungen, und planen Sie die Änderung von Anwendungen, in denen dieses Feature zurzeit verwendet wird. Verwenden Sie stattdessen die unter <drop_relational_or_xml_index> angegebene Syntax. XML-Indizes können mit abwärtskompatibler Syntax nicht gelöscht werden.

Entfernt einen oder mehrere relationale Indizes oder XML-Indizes aus der aktuellen Datenbank. In SQL Server 2005 können Sie einen gruppierten Index löschen und die daraus resultierende Tabelle in einer einzigen Transaktion in eine andere Dateigruppe oder in ein anderes Partitionsschema verschieben, indem Sie die Option MOVE TO angeben.

Die DROP INDEX-Anweisung gilt nicht für Indizes, die durch Definieren der Einschränkung PRIMARY KEY oder UNIQUE erstellt wurden. Verwenden Sie ALTER TABLE mit der DROP CONSTRAINT-Klausel, wenn Sie die Einschränkung und den entsprechenden Index entfernen möchten.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

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

Argumente

  • index_name
    Der Name des zu löschenden Indexes.
  • database_name
    Der Name der Datenbank.
  • schema_name
    Der Name des Schemas, zu dem die Tabelle oder Sicht gehört.
  • table_or_view_name
    Der Name der Tabelle oder Sicht, die mit dem Index verknüpft ist. Zum Anzeigen eines Berichts über die Indizes zu einem Objekt verwenden Sie die sys.indexes-Katalogsicht.
  • <drop_clustered_index_option>
    Steuert die Optionen für den gruppierten Index. Diese Optionen können nicht mit anderen Indextypen verwendet werden.
  • MAXDOP = max_degree_of_parallelism
    Setzt die Konfigurationsoption max degree of parallelism für die Dauer des Indexerstellungsvorgangs außer Kraft. Weitere Informationen finden Sie unter max degree of parallelism (Option). Verwenden Sie MAXDOP, um die Anzahl von Prozessoren zu begrenzen, die bei der Ausführung paralleler Pläne verwendet werden. Die maximale zulässige Anzahl sind 64 Prozessoren.

    Mögliche Werte für max_degree_of_parallelism sind:

    • 1
      Unterdrückt die Generierung paralleler Pläne.
    • >1
      Schränkt die maximale Anzahl von Prozessoren, die bei einem parallelen Indexvorgang verwendet werden, auf die angegebene Anzahl ein.
    • 0 (Standard)
      Verwendet abhängig von der aktuellen Systemlast die tatsächlich vorhandene Anzahl von Prozessoren oder weniger.

    Weitere Informationen finden Sie unter Konfigurieren von Parallelindexvorgänge.

    ms176118.note(de-de,SQL.90).gifHinweis:
    Parallele Indexvorgänge sind nur in SQL Server 2005 Enterprise Edition verfügbar.
  • ONLINE = ON | OFF
    Gibt an, ob zugrunde liegende Tabellen und dazugehörige Indizes während des Indexerstellungsvorgangs für Abfragen und Datenänderungen zur Verfügung stehen. Der Standardwert ist OFF.

    • ON
      Langfristigen Tabellensperren werden nicht aufrechterhalten. Abfragen oder Aktualisierungen der zugrunde liegenden Tabelle können fortgesetzt werden.
    • OFF
      Tabellensperren werden angewendet, und die Tabelle steht für die Dauer der Indexerstellungsvorgangs nicht zur Verfügung.

    Die Option ONLINE kann nur dann angegeben werden, wenn Sie gruppierte Indizes löschen. Weitere Informationen finden Sie im Abschnitt mit Hinweisen.

    ms176118.note(de-de,SQL.90).gifHinweis:
    Onlineindexvorgänge sind nur in SQL Server 2005 Enterprise Edition verfügbar.
  • MOVE TO
    Gibt einen Speicherort an, an den die Datenzeilen verschoben werden, die sich zurzeit auf der Blattebene des gruppierten Indexes befinden. Die Daten werden in einen Heap an den neuen Speicherort verschoben. Als neuen Speicherort können Sie entweder ein Partitionsschema oder eine Dateigruppe angeben, das Partitionsschema oder die Dateigruppe muss jedoch bereits vorhanden sein. MOVE TO ist für indizierte Sichten oder nicht gruppierte Indizes nicht gültig. Wird kein Partitionsschema oder keine Dateigruppe angegeben, dann befindet sich die daraus resultierende Tabelle entsprechend der Definition für den gruppierten Index im Partitionsschema oder in der Dateigruppe.

    Wird ein gruppierter Index mit MOVE TO gelöscht, werden alle nicht gruppierten Indizes für die Basistabelle neu erstellt. Sie verbleiben jedoch in ihren ursprünglichen Dateigruppen oder Partitionsschemas. Wenn die Basistabelle in eine andere Dateigruppe oder ein anderes Partitionsschema verschoben wird, werden die nicht gruppierten Indizes nicht verschoben, um dem neuen Speicherort der Basistabelle (Heap) zu entsprechen. Deshalb ist es möglich, dass die nicht gruppierten Indizes nicht mehr mit dem Heap ausgerichtet sind, selbst wenn sie vorher mit dem gruppierten Index ausgerichtet wurden. Weitere Informationen zur Ausrichtung des partitionierten Indexes finden Sie unter Spezielle Richtlinien für partitionierte Indizes.

  • partition_scheme_name ( column_name )
    Gibt ein Partitionsschema als Speicherort für die resultierende Tabelle an. Das Partitionsschema muss bereits durch Ausführen von CREATE PARTITION SCHEME oder ALTER PARTITION SCHEME erstellt worden sein. Wird kein Speicherort angegeben und ist die Tabelle partitioniert, dann wird die Tabelle in das Partitionsschema des vorhandenen gruppierten Indexes aufgenommen.

    Für den Spaltennamen im Schema gibt es keine Beschränkung auf die Spalten in der Indexdefinition. Jede beliebige Spalte in der Basistabelle kann angegeben werden.

  • filegroup_name
    Gibt eine Dateigruppe als Speicherort für die resultierende Tabelle an. Wird kein Speicherort angegeben und ist die Tabelle nicht partitioniert, dann wird die resultierende Tabelle in die Dateigruppe aufgenommen, in der sich der gruppierte Index befindet. Die Dateigruppe muss bereits vorhanden sein.
  • "default"
    Gibt den Standardspeicherort für die resultierende Tabelle an.

    ms176118.note(de-de,SQL.90).gifHinweis:
    In diesem Kontext ist DEFAULT kein Schlüsselwort. Es ist ein Bezeichner für die Standarddateigruppe und muss eingeschränkt werden, wie in MOVE TO "default" oder MOVE TO [default]. Wenn "default" angegeben wird, dann muss für die Option QUOTED_IDENTIFIER für die aktuelle Sitzung ON festgelegt werden. Dies ist die Standardeinstellung. Weitere Informationen finden Sie unter SET QUOTED_IDENTIFIER (Transact-SQL).

Hinweise

Wenn ein nicht gruppierter Index gelöscht wird, wird die Indexdefinition aus den Metadaten entfernt, und die Indexdatenseiten (in der B-Struktur) werden aus den Datenbankdateien entfernt. Wenn ein gruppierter Index gelöscht wird, wird die Indexdefinition aus den Metadaten entfernt und die auf der Blattebene des gruppierten Indexes gespeicherten Datenzeilen werden in der daraus resultierenden, nicht sortierten Tabelle (Heap) gespeichert. Der gesamte Speicherplatz, der vorher für den Index benötigt wurde, wird wieder freigegeben. Dieser Speicherplatz kann dann für beliebige Datenbankobjekte verwendet werden.

Ein Index kann nicht gelöscht werden, wenn die Dateigruppe, in der sich der Index befindet, offline oder schreibgeschützt ist.

Wenn der gruppierte Index einer indizierten Sicht gelöscht wird, dann werden alle nicht gruppierten Indizes und automatisch erstellten Statistiken dieser Sicht automatisch gelöscht. Manuell erstellte Statistiken werden nicht gelöscht.

Die Syntax index_name ON { table_or_view_name } ist in SQL Server 2005 neu. Die Syntaxtable_or_view_name**.**index_name wurde aus Gründen der Abwärtskompatibilität beibehalten. Werden beide Optionen in einer Transaktion zusammengeführt, führt dies dazu, dass die Anweisung fehlschlägt. XML-Indizes können mit abwärtskompatibler Syntax nicht gelöscht werden.

Werden Indizes mit 128 oder mehr Blöcken gelöscht, dann verzögert das SQL Server 2005-Datenbankmodul die Aufhebung der Seitenzuordnungen und der dazugehörigen Sperren, bis der Commit für die Transaktion ausgeführt ist. Weitere Informationen finden Sie unter Löschen und Neuerstellen großer Objekte.

Gelegentlich werden Indizes gelöscht und neu erstellt, um den Index neu zu organisieren oder neu zu erstellen, beispielsweise um einen neuen Füllfaktorwert anzuwenden oder um Daten nach dem Massenladen neu zu organisieren. Für diesen Vorgang ist die Verwendung von ALTER INDEX effizienter, insbesondere bei gruppierten Indizes. ALTER INDEX REBUILD verwendet Optimierungen, um den Aufwand der Neuerstellung der nicht gruppierten Indizes zu vermeiden.

Verwenden von Optionen mit DROP INDEX

In SQL Server 2005 können Sie folgende Indexoptionen festlegen, wenn Sie einen gruppierten Index löschen: MAXDOP, ONLINE und MOVE TO.

Verwenden Sie MOVE TO, um den gruppierten Index zu löschen und um die daraus resultierende Tabelle in einer einzigen Transaktion in eine andere Dateigruppe oder in ein anderes Partitionsschema zu verschieben.

Wenn Sie ONLINE = ON angeben, werden Abfragen und Änderungen der zugrunde liegenden Daten und dazugehörigen nicht gruppierten Indizes nicht von den DROP INDEX-Transaktion blockiert. Online kann jeweils nur ein gruppierter Index gelöscht werden. Eine vollständige Beschreibung der Option ONLINE finden Sie unter CREATE INDEX (Transact-SQL).

Sie können einen gruppierten Index nicht online löschen, wenn der Index für eine Sicht deaktiviert ist oder in den Datenzeilen auf Blattebene die Spalte text, ntext, image, varchar(max), nvarchar(max), varbinary(max) oder xml enthält.

Für das Verwenden der Optionen ONLINE = ON und MOVE TO wird zusätzlicher temporärer Speicherplatz benötigt. Weitere Informationen finden Sie unter Ermitteln der Speicherplatzanforderungen für Indizes.

Wenn ein Index gelöscht wird, wird der daraus resultierende Heap in der Katalogsicht sys.indexes mit NULL in der Spalte name angezeigt. Zum Anzeigen des Tabellennamens verknüpfen Sie sys.indexes mit sys.tables für object_id. Unter Beispiel D finden Sie eine Beispielabfrage.

Auf Computern mit mehreren Prozessoren, auf denen SQL Server 2005 Enterprise Edition ausgeführt wird, kann DROP INDEX wie andere Abfragen mehrere Prozessoren verwenden, um die Scan- und Sortiervorgänge auszuführen, die für das Löschen des gruppierten Indexes erforderlich sind. Sie können manuell die Anzahl von Prozessoren konfigurieren, die für die Ausführung der DROP INDEX-Anweisung verwendet werden sollen, indem Sie die Indexoption MAXDOP angeben. Weitere Informationen finden Sie unter Konfigurieren von Parallelindexvorgänge.

XML-Indizes

Optionen können nicht angegeben werden, wenn Sie einen XML-Index löschen. Wird ein primärer XML-Index gelöscht, werden alle dazugehörigen sekundären XML-Indizes automatisch gelöscht. Weitere Informationen finden Sie unter Indizes für Spalten vom xml-Datentyp.

Berechtigungen

Für das Ausführen von DROP INDEX ist mindestens eine ALTER-Berechtigung für die Tabelle oder Sicht erforderlich. Über diese Berechtigungen verfügen standardmäßig die Mitglieder der festen Serverrolle sysadmin und die Mitglieder der festen Datenbankrollen db_ddladmin und db_owner.

Beispiele

A. Löschen eines Indexes

Im folgenden Beispiel wird der Index IX_ProductVendor_VendorID für die Tabelle ProductVendor gelöscht.

USE AdventureWorks;
GO
DROP INDEX IX_ProductVendor_VendorID 
    ON Purchasing.ProductVendor;
GO

B. Löschen mehrerer Indizes

Im folgenden Beispiel werden zwei Indizes für eine Transaktion gelöscht.

USE AdventureWorks;
GO
DROP INDEX
    IX_PurchaseOrderHeader_EmployeeID ON Purchasing.PurchaseOrderHeader,
    IX_VendorAddress_AddressID ON Purchasing.VendorAddress;
GO

C. Online-Löschen eines gruppierten Indexes und Festlegen der Option MAXDOP

Im folgenden Beispiel wird ein gruppierter Index gelöscht, wobei für die Option ONLINE die Einstellung ON und für MAXDOP die Einstellung 8 festgelegt ist. Da die Option MOVE TO nicht angegeben wurde, wird die daraus resultierende Tabelle in der gleichen Dateigruppe wie der Index gespeichert.

ms176118.note(de-de,SQL.90).gifHinweis:
Dieses Beispiel kann nur in SQL Server 2005 Enterprise Edition ausgeführt werden.
USE AdventureWorks;
GO
DROP INDEX AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate 
    ON Production.BillOfMaterials WITH (ONLINE = ON, MAXDOP = 2);
GO

D. Online-Löschen eines gruppierten Indexes und Verschieben der Tabelle in eine neue Dateigruppe

Im folgenden Beispiel wird ein gruppierter Index online gelöscht, und die daraus resultierende Tabelle (Heap) wird in die Dateigruppe NewGroup verschoben, wofür die MOVE TO-Klausel verwendet wird. Die Katalogsichten sys.indexes, sys.tables und sys.filegroups werden abgefragt, um die Platzierung von Index und Tabelle in den Dateigruppen vor und nach der Verschiebung zu prüfen.

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. Online-Löschen einer PRIMARY KEY-Einschränkung

Indizes, die als Ergebnis der Erstellung von PRIMARY KEY- oder UNIQUE-Einschränkungen erstellt werden, können nicht mit DROP INDEX gelöscht werden. Vielmehr werden sie mit der ALTER TABLE DROP CONSTRAINT-Anweisung gelöscht. Weitere Informationen finden Sie unter ALTER TABLE.

Im folgenden Beispiel wird ein gruppierter Index mit einer PRIMARY KEY-Einschränkung gelöscht, indem die Einschränkung gelöscht wird. Die Tabelle ProductCostHistory besitzt keine FOREIGN KEY-Einschränkung. Wenn dem so wäre, müssten diese Einschränkungen zuerst entfernt werden.

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. Löschen eines XML-Indexes

Im folgenden Beispiel wird ein XML-Index für die Tabelle ProductModel gelöscht.

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

Siehe auch

Verweis

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)

Andere Ressourcen

Ermitteln der Speicherplatzanforderungen für Indizes
Löschen von Indizes

Hilfe und Informationen

Informationsquellen für SQL Server 2005