Sdílet prostřednictvím


DROP INDEX (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)databáze SQL v Microsoft Fabric

Odstraní jeden nebo více relačních, prostorových, filtrovaných nebo XML indexů ze současné databáze. Můžete zrušit shlukovaný index a přesunout výslednou tabulku do jiné skupiny souborů nebo schématu rozdělení v rámci jedné transakce tím, že zadáte MOVE TO tuto možnost.

Toto DROP INDEX tvrzení se nevztahuje na indexy vytvořené definováním PRIMARY KEY nebo UNIQUE omezeními. Pro odstranění omezení a odpovídajícího indexu použijte ALTER TABLE s klauzulí DROP CONSTRAINT .

Důležité

Syntax definovaná v bude <drop_backward_compatible_index> v budoucí verzi SQL Serveru odstraněna. Vyhněte se používání této syntaxe v nové vývojové práci a plánujte upravovat aplikace, které tuto funkci aktuálně používají. Použijte syntaxi uvedenou níže.<drop_relational_or_xml_or_spatial_index> XML indexy nelze odstranit pomocí zpětně kompatibilní syntaxe.

Transact-SQL konvence syntaxe

Syntaxe

Syntax pro SQL Server (všechny možnosti kromě skupiny souborů a datového toku platí pro databázi Azure SQL).

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

Syntaxe pro 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 }

Syntaxe pro Azure Synapse Analytics a Platform Platform System (PDW).

DROP INDEX index_name ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ; ]

Arguments

POKUD EXISTUJE

Platí pro: SQL Server 2016 (13.x) a novější verze.

Podmíněně se index vyřadí pouze tehdy, pokud už existuje.

index_name

Název indexu, který má být vynechán.

database_name

Název databáze.

schema_name

Název schématu, do kterého patří tabulka nebo zobrazení.

table_or_view_name

Název tabulky nebo pohledu spojeného s indexem. Prostorové indexy jsou podporovány pouze v tabulkách.

Pro zobrazení detailů všech indexů v databázi použijte zobrazení katalogu sys.indexes .

Azure SQL Database podporuje tříčlenný formát názvu: database_name.schema_name.object_name kdy database_name je aktuální databáze, nebo database_name je tempdb a object_name začíná na # nebo ##.

<drop_clustered_index_option>

Platí na: SQL Server 2008 (10.0.x) a novější verze, SQL Database.

Ovládá seskupené indexové možnosti. Tyto možnosti nelze použít s jinými typy indexů.

MAXDOP = max_degree_of_parallelism

Platí na: SQL Server 2008 (10.0.x) a novější verze, SQL Database (pouze výkonnostní úrovně P2 a P3).

Přepisuje max degree of parallelism konfigurační možnost během operace index. Pro více informací viz Konfigurace maximálního stupně paralelismu (možnost konfigurace serveru). Použití MAXDOP k omezení počtu procesorů použitých při operaci indexového buildování. Maximum je 64 procesorů.

Důležité

MAXDOP není povoleno pro prostorové nebo XML indexy.

max_degree_of_parallelism může být jedna z následujících hodnot.

Hodnota Description
1 Potlačuje generování paralelních plánů
>1 Omezuje maximální počet procesorů použitých v paralelní indexové build operaci na specifikovaný počet
0 (výchozí) Používá skutečný počet procesorů nebo méně podle aktuálního zatížení systému

Další informace naleznete v tématu Konfigurace paralelních indexových operací.

Poznámka:

Paralelní operace indexu nejsou k dispozici v každé edici SQL Serveru. Seznam funkcí podporovaných edicemi SQL Serveru najdete v tématu Edice a podporované funkce systému SQL Server 2022.

ONLINE = ZAPNUTO | PRYČ

Platí na: SQL Server 2008 (10.0.x) a pozdější verze, Azure SQL Database.

Určuje, jestli jsou podkladové tabulky a přidružené indexy dostupné pro dotazy a úpravy dat během operace indexu. Výchozí hodnota je OFF.

  • ON: Dlouhodobé zámky stolů nejsou udrženy. To umožňuje pokračování dotazů nebo aktualizací podkladové tabulky.

  • OFF: Jsou aplikovány tabulkové zámky a tabulka není během indexové operace dostupná.

Tuto ONLINE možnost lze nastavit pouze při vyřazení shlukovaných indexů. Další informace najdete v části Poznámky.

Poznámka:

Online indexovací operace nejsou dostupné v každé edici SQL Serveru. Seznam funkcí podporovaných edicemi SQL Serveru najdete v tématu Edice a podporované funkce systému SQL Server 2022.

PŘESUN DO { partition_scheme_name ( column_name ) | filegroup_name | "výchozí" }

platí pro: SQL Server 2008 (10.0.x) a novější verze. SQL Database podporuje "default" jako název souborové skupiny.

Specifikuje místo pro přesun datových řádků, které se aktuálně nacházejí na úrovni listu shlukovaného indexu. Data jsou přesunuta na nové místo ve formě haldy. Můžete určit buď schéma oddílů, nebo skupinu souborů jako novou lokaci, ale schéma oddílů nebo skupina souborů musí již existovat. MOVE TO není platný pro indexovaná zobrazení nebo neclusterované indexy. Pokud není specifikováno schéma oddílů nebo souborová skupina, výsledná tabulka se nachází ve stejném schématu oddílů nebo skupině souborů, jaké bylo definováno pro shlukovaný index.

Pokud je shlukovaný index odstraněn pomocí MOVE TO, všechny neshlukované indexy v základní tabulce jsou znovu sestaveny, ale zůstávají ve svých původních souborových skupinách nebo schématech oddílů. Pokud je základní tabulka přesunuta do jiné skupiny souborů nebo schématu rozdělení, neshlukované indexy se nepřesouvají tak, aby se shodovaly s novým umístěním základní tabulky (haldy). Proto i když byly neshlukované indexy dříve zarovnány s indexem shluku, nemusí být již zarovnány s haldou. Další informace o zarovnání dělených indexů najdete v tématu Dělené tabulky a indexy.

partition_scheme_name ( column_name )

Platí na: SQL Server 2008 (10.0.x) a novější verze, SQL Database.

Specifikuje partition schéma jako umístění výsledné tabulky. Schéma rozdělení musí být již vytvořeno vykonáním buď CREATE PARTITION SCHEME, nebo ALTER PARTITION SCHEME. Pokud není určeno žádné umístění a tabulka je rozdělena, tabulka je zahrnuta do stejného schématu rozdělení jako stávající shlukovaný index.

Název sloupce v schématu není omezen pouze na sloupce v indexové definici. Lze specifikovat jakýkoli sloupec v základní tabulce.

filegroup_name

platí pro: SQL Server 2008 (10.0.x) a novější verze.

Specifikuje skupinu souborů jako umístění výsledné tabulky. Pokud není určena žádná lokalita a tabulka není rozdělena na partition, výsledná tabulka je zahrnuta do stejné skupiny souborů jako clusterovaný index. Skupina souborů už musí existovat.

[výchozí]

Specifikuje výchozí umístění výsledné tabulky.

Poznámka:

V tomto kontextu default není klíčové slovo. Jedná se o identifikátor výchozí skupiny souborů, který musí být oddělený jako in MOVE TO "default" nebo MOVE TO [default]. Pokud "default" je specifikováno, musí být volba QUOTED_IDENTIFIER nastavena ON pro aktuální relaci. Toto je výchozí nastavení. Další informace naleznete v tématu SET QUOTED_IDENTIFIER.

FILESTREAM_ON { partition_scheme_name | filestream_filegroup_name | "výchozí" }

platí pro: SQL Server 2008 (10.0.x) a novější verze.

Specifikuje místo pro přesun tabulky FILESTREAM, která je aktuálně na úrovni listu shlukovaného indexu. Data jsou přesunuta na nové místo ve formě haldy. Můžete určit buď schéma oddílů, nebo skupinu souborů jako novou lokaci, ale schéma oddílů nebo skupina souborů musí již existovat. FILESTREAM ON není platný pro indexovaná zobrazení nebo neclusterované indexy. Pokud není specifikováno schéma rozdělení, data jsou umístěna ve stejném schématu rozdělení, jaké bylo definováno pro shlukovaný index.

partition_scheme_name

Specifikuje schéma rozdělení pro data FILESTREAM. Schéma rozdělení musí být již vytvořeno vykonáním buď CREATE PARTITION SCHEME, nebo ALTER PARTITION SCHEME. Pokud není určeno žádné umístění a tabulka je rozdělena, tabulka je zahrnuta do stejného schématu rozdělení jako stávající shlukovaný index.

Pokud specifikujete schéma rozdělení pro MOVE TO, musíte použít stejné schéma FILESTREAM ONpro .

filestream_filegroup_name

Specifikuje souborovou skupinu FILESTREAM pro data FILESTREAM. Pokud není určena žádná lokalita a tabulka není rozdělena na partition, data jsou zahrnuta do výchozí skupiny souborů FILESTREAM.

[výchozí]

Specifikuje výchozí umístění dat FILESTREAM.

Poznámka:

V tomto kontextu default není klíčové slovo. Jedná se o identifikátor výchozí skupiny souborů, který musí být oddělený jako in MOVE TO "default" nebo MOVE TO [default]. Pokud "default" je tato možnost zadaná, QUOTED_IDENTIFIER musí být ON pro aktuální relaci. Toto je výchozí nastavení. Další informace naleznete v tématu SET QUOTED_IDENTIFIER.

Poznámky

Když je vynechán neclusterovaný index, definice indexu je odstraněna z metadat a indexové datové stránky (B-strom) jsou odstraněny z databázových souborů. Když je shlukovaný index vynechán, definice indexu je z metadat odstraněna a datové řádky uložené na úrovni listu shlukovaného indexu jsou uloženy do výsledné neuspořádané tabulky, haldy. Veškeré místo, které index dříve obsadil, je znovu získáno. Tento prostor pak lze využít pro jakýkoli databázový objekt.

Poznámka:

Dokumentace používá termín B-tree obecně v odkazu na indexy. V indexech rowstore databázový stroj implementuje strom B+. To neplatí pro indexy columnstore ani indexy v tabulkách optimalizovaných pro paměť. Další informace najdete v SQL Serveru a architektuře indexu Azure SQL a průvodci návrhem.

Index nelze zrušit, pokud je souborová skupina, ve které se nachází, offline nebo nastavena pouze pro čtení.

Když je shlukovaný index indexovaného pohledu vynechán, všechny ne-shlukované indexy a automaticky vytvořené statistiky ve stejném pohledu jsou automaticky odstraněny. Ručně vytvořené statistiky se nevynesou.

Syntaxe <table_or_view_name>.<index_name> je zachována pro zpětnou kompatibilitu. XML index nebo prostorový index nelze odstranit pomocí zpětně kompatibilní syntaxe.

Někdy jsou indexy opuštěny a znovu vytvořeny za účelem reorganizace nebo přestavby indexu, například pro aplikaci nové hodnoty faktoru vyplnění nebo pro reorganizaci dat po hromadném zatížení. K tomu je efektivnější použít ALTER INDEX , zejména pro shlukované indexy. ALTER INDEX REBUILD má optimalizace, které zabraňují režijním nákladům na přestavbu neshlukovaných indexů.

Odložené oddělování

Když jsou indexy s 128 a více rozsahy vyřazeny, databázový engine odkládá skutečné deallokace stránek a jejich přidružené zámky až po dokončení transakce. Indexy se vyřazují ve dvou samostatných fázích: logické a fyzické. V logické fázi jsou stávající alokační jednotky používané indexem označeny k dealokaci a uzamčeny, dokud transakce není potvrzena. Ve fyzické fázi proces na pozadí odstraní stránky označené pro deallocation. To znamená, že uvolněný prostor nemusí DROP INDEX být okamžitě k dispozici pro nové alokace.

Pokud je povolena zrychlená obnova databáze , používají se oddělené logické a fyzické fáze bez ohledu na počet rozsahů.

Použijte možnosti s DROP INDEX

Při vypuštění shlukovaného indexu můžete nastavit následující možnosti indexu: MAXDOP, ONLINE, a MOVE TO.

Použijte MOVE TO k vypuštění shlukovaného indexu a přesunu výsledné tabulky do jiné skupiny souborů nebo schématu oddílů v rámci jedné transakce.

Když zadáte ONLINE = ON, dotazy a úpravy základních dat a souvisejících neklastrovaných indexů nejsou transakcí blokovány DROP INDEX . Najednou lze online umístit pouze jeden shlukovaný index. Pro úplný popis ONLINE této možnosti viz VYTVOŘIT INDEX.

Nemůžete zveřejnit clusterovaný index online, pokud je index v zobrazení zakázán nebo obsahuje text, ntext, image, varchar(max),nvarchar(max), nvarchar(max), varbinary(max) nebo xml sloupce v řádkech na úrovni listů.

Použití ONLINE = ON možností a MOVE TO vyžaduje více dočasného místa na disku.

Po vypuštění indexu se výsledná halda objeví v katalogovém sys.indexes zobrazení s ve NULL sloupci name . Pro zobrazení názvu tabulky spojte sys.indexes s sys.tables na .object_id Pro příklad dotazu viz příklad D.

Na multiprocesorových počítačích, které běží na SQL Server 2005 Enterprise edition nebo novější DROP INDEX , může být více procesorů použito pro provádění operací skenování a třídění spojených s vyřazením clusterovaného indexu, stejně jako jiné dotazy. Počet procesorů, které se používají k spuštění DROP INDEX příkazu, můžete ručně nastavit zadáním indexové MAXDOP volby. Další informace naleznete v tématu Konfigurace paralelních indexových operací.

Když je odstraněn clusterovaný index, odpovídající oddíly haldy si ponechávají svoje nastavení komprese dat, pokud nedojde ke změně schématu dělení. Pokud se schéma rozdělení změní, všechny oddíly jsou znovu postaveny do nekomprimovaného stavu (DATA_COMPRESSION = NONE). Pro odstranění shlukovaného indexu a změnu schématu dělení jsou potřeba následující dva kroky:

  1. Zahoďte clusterovaný index.

  2. Upravte tabulku pomocí ALTER TABLE ... REBUILD ... možnosti specifikující kompresi.

Když je shlukovaný index vyřazen OFFLINE, odstraní se pouze horní úrovně shlukovaných indexů; operace je tedy rychlá. Když je clusterovaný index vyhozen ONLINE, SQL Server haldu znovu sestaví dvakrát, jednou pro krok 1 a jednou pro krok 2. Další informace o kompresi dat naleznete v tématu Komprese dat.

Indexy XML

Možnosti nelze při vypuštění XML indexu specifikovat žádné možnosti. Také nemůžeš použít syntaxi <table_or_view_name>.<index_name> . Když je primární XML index vyřazen, všechny příslušné sekundární XML indexy jsou automaticky vyřazeny. Další informace naleznete v tématu Indexy XML (SQL Server).

Prostorové indexy

Prostorové indexy jsou podporovány pouze v tabulkách. Když vypustíte prostorový index, nemůžete specifikovat žádné možnosti ani použít syntaxi <table_or_view_name>..<index_name> . Správná syntax je následující:

DROP INDEX <spatial_index_name> ON <spatial_table_name>;

Pro více informací o prostorových indexech viz Přehled prostorových indexů.

Povolení

K provedení DROP INDEXse vyžaduje minimálně oprávnění ALTER v tabulce nebo zobrazení. Toto oprávnění je ve výchozím nastavení uděleno pevné sysadmin serverové roli a db_ddladmin pevné databázové roli a db_owner .

Examples

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

A. Ztrať index

Následující příklad maže index IX_ProductVendor_BusinessEntityID v tabulce ProductVendor v databázi AdventureWorks2025.

DROP INDEX IX_ProductVendor_BusinessEntityID
    ON Purchasing.ProductVendor;
GO

B. Zrušit více indexů

Následující příklad maže dva indexy v jedné transakci v databázi AdventureWorks2025.

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

C. Vložte shlukovaný index online a nastavte možnost MAXDOP

Následující příklad maže shlukovaný index s ONLINE možností nastavenou na ON a nastavenou MAXDOP na 8. Protože tato MOVE TO možnost nebyla specifikována, výsledná tabulka je uložena ve stejné skupině souborů jako index.

Platí na: SQL Server 2008 (10.0.x) a novější verze, SQL Database.

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

D. Vložte shlukovaný index online a přesuněte tabulku do nové skupiny souborů

Následující příklad odstraní clusterovaný index online a přesune výslednou tabulku (haldu) do skupiny souborů NewGroup pomocí klauzule MOVE TO. Katalogová zobrazení sys.indexes, sys.tablesa sys.filegroups jsou dotazována ke kontrole umístění indexu a tabulky ve skupinách souborů před a po přesunu. Od SQL Server 2016 (13.x) můžete používat syntaxi DROP INDEX IF EXISTS .

platí pro: SQL Server 2008 (10.0.x) a novější verze.

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

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

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

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

E. Zrušte online omezení PRIMÁRNÍHO KLÍČE

Indexy vytvořené jako výsledek vytvoření PRIMARY KEY nebo UNIQUE omezení nelze odstranit použitím .DROP INDEX Jsou vyřazeni pomocí ALTER TABLE DROP CONSTRAINT výroku. Další informace naleznete v tématu ALTER TABLE.

Následující příklad maže shlukovaný index s omezením PRIMARY KEY tím, že toto omezení vynechá. Tabulka ProductCostHistory nemá FOREIGN KEY žádná omezení. Kdyby ano, musela by být tato omezení odstraněna nejdřív.

-- 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. Drop XML index

Následující příklad umisťuje XML index do tabulky ProductModel v databázi AdventureWorks2025.

DROP INDEX PXML_ProductModel_CatalogDescription
    ON Production.ProductModel;

G. Vložte shlukovaný index do tabulky FILESTREAM

Následující příklad smaže shlukovaný index online a přesune výslednou tabulku (haldu) a data FILESTREAM do schématu MyPartitionScheme rozdělení pomocí klauzule MOVE TO i klauzule FILESTREAM ON .

platí pro: SQL Server 2008 (10.0.x) a novější verze.

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