DROP INDEX (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Quita uno o más índices XML, filtrados, espaciales o relacionales de la base de datos actual. Puede quitar un índice agrupado y mover la tabla resultante a otro grupo de archivos o esquema de partición en una sola transacción especificando la MOVE TO
opción .
La DROP INDEX
instrucción no se aplica a los índices creados mediante la definición PRIMARY KEY
de restricciones o UNIQUE
. Para quitar la restricción y el índice correspondiente, use ALTER TABLE con la DROP CONSTRAINT
cláusula .
Importante
La sintaxis definida en <drop_backward_compatible_index>
se quitará en una versión futura de SQL Server. Evite utilizar esta sintaxis en nuevos trabajos de programación y tenga previsto modificar las aplicaciones que actualmente la utilizan. En su lugar, utilice la sintaxis especificada en <drop_relational_or_xml_or_spatial_index>
. Los índices XML no se pueden quitar mediante la sintaxis compatible con versiones anteriores.
Convenciones de sintaxis de Transact-SQL
Sintaxis
Sintaxis para SQL Server (todas las opciones excepto el grupo de archivos y la secuencia de archivos se aplican a 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" } ]
}
Sintaxis de 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 }
Sintaxis de Azure Synapse Analytics and Analytics Platform System (PDW).
DROP INDEX index_name ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ; ]
Argumentos
IF EXISTS
Se aplica a: SQL Server 2016 (13.x) y versiones posteriores.
Quita el índice condicionalmente solo si ya existe.
index_name
Nombre del índice que se va a quitar.
database_name
El nombre de la base de datos.
schema_name
Nombre del esquema al que pertenece la tabla o la vista.
table_or_view_name
Nombre de la tabla o vista asociada al índice. Los índices espaciales solo se admiten en tablas.
Para mostrar un informe de los índices en un objeto, use la vista de catálogo sys.indexes.
Azure SQL Database admite el formato de nombre de tres partes: database_name.[schema_name].object_name
cuando database_name
es la base de datos actual o el database_name es tempdb
y el object_name comienza con #
.
<drop_clustered_index_option>
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, SQL Database.
Controla las opciones de los índices clúster. Estas opciones no se pueden usar con otros tipos de índice.
MAXDOP = max_degree_of_parallelism
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, SQL Database (solo niveles de rendimiento P2 y P3).
Reemplaza la opción de configuración de max_degree_of_parallelism durante la operación de índice. Para obtener más información, consulte Configuración del grado máximo de paralelismo (opción de configuración del servidor). Use MAXDOP
para limitar el número de procesadores usados en una ejecución de plan paralelo. El máximo es 64 procesadores.
Importante
MAXDOP
no se permite para índices espaciales ni índices XML.
max_degree_of_parallelism puede ser uno de los siguientes valores.
Valor | Descripción |
---|---|
1 |
Suprime la generación de planes paralelos |
>1 |
Restringe el número máximo de procesadores usados en una operación de índice paralela al número especificado. |
0 (valor predeterminado) |
Usa el número real de procesadores o menos en función de la carga de trabajo del sistema actual. |
Para obtener más información, vea Configurar operaciones de índice en paralelo.
Nota
Las operaciones de índices en paralelo no están disponibles en todas las ediciones de SQL Server. Para obtener una lista de las características admitidas por las ediciones de SQL Server, consulte Ediciones y características admitidas de SQL Server 2022.
ONLINE = ON | OFF
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, Azure SQL Database.
Especifica si las tablas subyacentes y los índices asociados están disponibles para realizar consultas y modificar datos durante la operación de índice. El valor predeterminado es OFF
.
ON
: no se mantienen bloqueos de tabla a largo plazo. Esto permite que continúen las consultas o actualizaciones en la tabla subyacente.OFF
: se aplican bloqueos de tabla y la tabla no está disponible durante la operación de índice.
La ONLINE
opción solo se puede especificar al quitar índices agrupados. Para obtener más información, vea la sección Notas.
Nota:
Las operaciones de índices en línea no están disponibles en todas las ediciones de SQL Server. Para obtener una lista de las características admitidas por las ediciones de SQL Server, consulte Ediciones y características admitidas de SQL Server 2022.
MOVER A { partition_scheme_name ( column_name ) | filegroup_name | "default" }
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores. SQL Database admite "default"
como nombre del grupo de archivos.
Especifica la ubicación donde se moverán las filas de datos que están actualmente en el nivel hoja del índice clúster. Los datos se mueven a la nueva ubicación en forma de montón. Se puede especificar un esquema de partición o un grupo de archivos como la nueva ubicación, pero es necesario que ya existan. MOVE TO
no es válido para vistas indexadas o índices no agrupados. Si no se especifica un esquema de partición o un grupo de archivos, la tabla resultante se encuentra en el mismo esquema de partición o grupo de archivos que se definió para el índice agrupado.
Si se quita un índice agrupado mediante MOVE TO
, se vuelven a generar los índices no agrupados de la tabla base, pero permanecen en sus grupos de archivos originales o esquemas de partición. Si la tabla base se mueve a otro grupo de archivos o esquema de partición, los índices no agrupados no se mueven para que coincidan con la nueva ubicación de la tabla base (montón). Por lo tanto, aunque los índices no clúster estuvieran previamente alineados con el índice clúster, es posible que ya no lo estén con el montón. Para obtener más información sobre la alineación de índices con particiones, consulte Tablas e índices con particiones.
partition_scheme_name ( column_name )
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, SQL Database.
Especifica un esquema de partición como la ubicación de la tabla resultante. El esquema de partición ya debe crearse ejecutando CREATE PARTITION SCHEME o ALTER PARTITION SCHEME. Si no se especifica ninguna ubicación y la tabla tiene particiones, la tabla se incluye en el mismo esquema de partición que el índice clúster existente.
El nombre de columna del esquema no está restringido a las columnas de la definición de índice. Se puede especificar cualquier columna de la tabla base.
filegroup_name
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.
Especifica un grupo de archivos como la ubicación de la tabla resultante. Si no se especifica ninguna ubicación y la tabla no tiene particiones, la tabla resultante se incluye en el mismo grupo de archivos que el índice agrupado. El grupo de archivos debe existir previamente.
"default"
Especifica la ubicación predeterminada de la tabla resultante.
Nota:
En este contexto, el valor predeterminado no es una palabra clave. Es un identificador para el grupo de archivos predeterminado y debe delimitarse, como en MOVE TO "default"
o en MOVE TO [default]
. Si "default"
se especifica , la QUOTED_IDENTIFIER
opción debe establecerse ON
para la sesión actual. Esta es la configuración predeterminada. Para más información, consulte SET QUOTED_IDENTIFIER.
FILESTREAM_ON { partition_scheme_name | filestream_filegroup_name | "default" }
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.
Especifica la ubicación donde se moverá la tabla FILESTREAM que está actualmente en el nivel hoja del índice clúster. Los datos se mueven a la nueva ubicación en forma de montón. Se puede especificar un esquema de partición o un grupo de archivos como la nueva ubicación, pero es necesario que ya existan. FILESTREAM ON
no es válido para vistas indexadas o índices no agrupados. Si no se especifica un esquema de partición, los datos se encuentran en el mismo esquema de partición que se definió para el índice agrupado.
partition_scheme_name
Especifica un esquema de partición de los datos FILESTREAM. El esquema de partición ya debe crearse ejecutando CREATE PARTITION SCHEME o ALTER PARTITION SCHEME. Si no se especifica ninguna ubicación y la tabla tiene particiones, la tabla se incluye en el mismo esquema de partición que el índice clúster existente.
Si especifica un esquema de partición para MOVE TO
, debe usar el mismo esquema de partición para FILESTREAM ON
.
filestream_filegroup_name
Especifica un grupo de archivos FILESTREAM de los datos FILESTREAM. Si no se especifica ninguna ubicación y la tabla no tiene particiones, los datos se incluyen en el grupo de archivos FILESTREAM predeterminado.
"default"
Especifica la ubicación predeterminada de los datos FILESTREAM.
Nota:
En este contexto, el valor predeterminado no es una palabra clave. Es un identificador para el grupo de archivos predeterminado y debe delimitarse, como en MOVE TO "default"
o en MOVE TO [default]
. Si se especifica "default", la opción QUOTED_IDENTIFIER
debe tener el valor ON para la sesión actual. Esta es la configuración predeterminada. Para más información, consulte SET QUOTED_IDENTIFIER.
Comentarios
Cuando se quita un índice no clúster, la definición del índice se quita de los metadatos y las páginas de datos de índice (árbol B) se quitan de los archivos de base de datos. Cuando se quita un índice clúster, se quita la definición del índice de los metadatos y las filas de datos que se almacenaron en el nivel hoja del índice clúster se almacenan en la tabla resultante no ordenada, un montón. Se recuperará todo el espacio anteriormente ocupado por el índice. Después, se puede utilizar este espacio para cualquier objeto de base de datos.
Nota:
La documentación utiliza el término árbol B generalmente en referencia a los índices. En los índices del almacén de filas, el motor de la base de datos implementa un árbol B+. Esto no se aplica a los índices de almacén de columnas ni a los índices de tablas optimizadas para memoria. Para obtener más información, consulte la guía de diseño y arquitectura de índices de SQL Server y Azure SQL.
No se puede quitar un índice si el grupo de archivos en el que se encuentra está sin conexión o se establece en de solo lectura.
Cuando se quita el índice agrupado de una vista indexada, todos los índices no clúster y las estadísticas autocreadas en la misma vista se quitan automáticamente. No se quitan las estadísticas creadas manualmente.
La sintaxis <table_or_view_name>.<index_name>
se mantiene por motivos de compatibilidad con versiones anteriores. No se puede quitar un índice XML o un índice espacial mediante la sintaxis compatible con versiones anteriores.
Cuando se quitan índices con 128 extensiones o más, el Motor de base de datos aplaza las cancelaciones de asignación de página reales y los bloqueos asociados, hasta después de que se confirme la transacción.
A veces, los índices se quitan y se vuelven crear para reorganizarlos o volver a generarlos, por ejemplo, para aplicar un nuevo valor de factor de relleno o para reorganizar los datos después de una carga masiva. Para ello, el uso de ALTER INDEX es más eficaz, especialmente para los índices agrupados. ALTER INDEX REBUILD
tiene optimizaciones para evitar la sobrecarga de volver a generar los índices no clúster.
Uso de opciones con DROP INDEX
Puede establecer las siguientes opciones de índice al quitar un índice agrupado: MAXDOP
, ONLINE
y MOVE TO
.
Use MOVE TO
para quitar el índice agrupado y mover la tabla resultante a otro grupo de archivos o esquema de partición en una sola transacción.
Al especificar ONLINE = ON
, las consultas y las modificaciones en los datos subyacentes y los índices no clúster asociados no están bloqueados por la DROP INDEX
transacción. No se puede quitar más de un índice clúster en línea al mismo tiempo. Para obtener una descripción completa de la ONLINE
opción, consulte CREATE INDEX.
No se puede quitar un índice agrupado en línea si el índice está deshabilitado en una vista o contiene columnas text, ntext, image, varchar(max), nvarchar(max), varbinary(max)o xml en las filas de datos de nivel hoja.
El uso de las ONLINE = ON
opciones y MOVE TO
requiere más espacio en disco temporal.
Después de quitar un índice, el montón resultante aparece en la vista de sys.indexes
catálogo con NULL
en la name
columna . Para ver el nombre de la tabla, únase sys.indexes
a sys.tables
en object_id
. Dispone de una consulta de ejemplo en el ejemplo D.
En equipos de varios procesadores que ejecutan SQL Server 2005 Enterprise Edition o versiones posteriores, DROP INDEX
puede usar más procesadores para realizar las operaciones de examen y ordenación asociadas con la eliminación del índice agrupado, al igual que otras consultas. Puede configurar manualmente el número de procesadores que se usan para ejecutar la DROP INDEX
instrucción especificando la MAXDOP
opción de índice. Para obtener más información, vea Configurar operaciones de índice en paralelo.
Cuando se quita un índice clúster, las particiones del montón correspondientes retienen su valor de compresión de datos, a menos que se modifique el esquema de partición. Si se cambia el esquema de partición, todas las particiones se vuelven a generar en un estado sin comprimir (DATA_COMPRESSION = NONE
). Para quitar un índice clúster y cambiar el esquema de la partición, es necesario llevar a cabo los dos pasos siguientes:
Quitar el índice clúster.
Modifique la tabla mediante una
ALTER TABLE ... REBUILD ...
opción que especifique la opción de compresión.
Cuando se quita OFFLINE
un índice agrupado, solo se quitan los niveles superiores de índices agrupados; por lo tanto, la operación es rápida. Cuando se quita ONLINE
un índice agrupado, SQL Server vuelve a generar el montón dos veces, una vez para el paso 1 y una vez para el paso 2. Para obtener más información sobre la compresión de datos, consulte Compresión de datos.
índices XML
No se pueden especificar opciones al quitar un índiceXML. Además, no puede usar la <table_or_view_name>.<index_name>
sintaxis . Cuando se quita un índice XML principal, todos los índices XML secundarios asociados se quitan automáticamente. Para obtener más información, vea Índices XML (SQL Server).
Índices espaciales
Los índices espaciales solo se admiten en tablas. Al quitar un índice espacial, no se pueden especificar opciones ni usar .<index_name>
. La sintaxis correcta es la siguiente:
DROP INDEX <spatial_index_name> ON <spatial_table_name>;
Para más información sobre los índices espaciales, vea Información general sobre los índices espaciales.
Permisos
Para ejecutar DROP INDEX
se necesita, como mínimo, el permiso ALTER
en la tabla o en la vista. Este permiso se concede de forma predeterminada al rol fijo de servidor sysadmin y a los roles fijos de base de datos db_ddladmin y db_owner .
Ejemplos
Los ejemplos de código de Transact-SQL de este artículo utilizan la base de datos de ejemplo AdventureWorks2022
o AdventureWorksDW2022
, que se puede descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.
A Quitar un índice
En el ejemplo siguiente se elimina el índice IX_ProductVendor_BusinessEntityID
en la tabla ProductVendor
de la base de datos AdventureWorks2022.
DROP INDEX IX_ProductVendor_BusinessEntityID
ON Purchasing.ProductVendor;
GO
B. Quitar varios índices
En el ejemplo siguiente se eliminan dos índices en una única transacción de la base de datos AdventureWorks2022.
DROP INDEX
IX_PurchaseOrderHeader_EmployeeID ON Purchasing.PurchaseOrderHeader,
IX_Address_StateProvinceID ON Person.Address;
GO
C. Quitar un índice clúster en línea y establecer la opción MAXDOP
En el ejemplo siguiente se elimina un índice clúster con la opción ONLINE
establecida en ON
y MAXDOP
establecida en 8
. Dado que no se especificó la MOVE TO
opción, la tabla resultante se almacena en el mismo grupo de archivos que el índice.
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, SQL Database.
DROP INDEX AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate
ON Production.BillOfMaterials WITH (ONLINE = ON, MAXDOP = 2);
GO
D. Quitar un índice agrupado en línea y mover la tabla a un nuevo grupo de archivos
En el ejemplo siguiente se elimina un índice clúster en línea y se mueve la tabla resultante (montón) al grupo de archivos NewGroup
mediante la cláusula MOVE TO
. Las vistas de catálogo sys.indexes
, sys.tables
y sys.filegroups
se consultan para comprobar la ubicación del índice y la tabla en los grupos de archivos antes y después del desplazamiento. A partir de SQL Server 2016 (13.x), puede usar la DROP INDEX IF EXISTS
sintaxis .
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.
--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. Quitar una restricción PRIMARY KEY en línea
Los índices que se crean como resultado de la creación PRIMARY KEY
o UNIQUE
las restricciones no se pueden quitar mediante DROP INDEX
. Se quitan mediante la ALTER TABLE DROP CONSTRAINT
instrucción . Para más información, vea ALTER TABLE.
En el ejemplo siguiente se elimina un índice agrupado con una PRIMARY KEY
restricción quitando la restricción . La ProductCostHistory
tabla no FOREIGN KEY
tiene restricciones. Si lo hiciera, sería necesario quitar esas restricciones primero.
-- 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. Quitar un índice XML
En el ejemplo siguiente se quita un índice XML en la tabla ProductModel
de la base de datos AdventureWorks2022.
DROP INDEX PXML_ProductModel_CatalogDescription
ON Production.ProductModel;
G. Quitar un índice agrupado en una tabla FILESTREAM
En el ejemplo siguiente se elimina un índice clúster en línea y se mueven la tabla resultante (montón) y los datos FILESTREAM al esquema de partición MyPartitionScheme
mediante las cláusulas MOVE TO
y FILESTREAM ON
.
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.
DROP INDEX PK_MyClusteredIndex
ON dbo.MyTable
WITH (MOVE TO MyPartitionScheme,
FILESTREAM_ON MyPartitionScheme);
GO
Contenido relacionado
- 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
- sys.tables
- sys.filegroups
- sp_spaceused