删除索引
当一个索引不再需要时,可以将其从数据库中删除,以回收它当前使用的磁盘空间。这样数据库中的任何对象都可以使用此回收的空间。Deleting an index(删除索引)与 dropping an index(删除索引)是同义的。
必须先删除 PRIMARY KEY 或 UNIQUE 约束,才能删除约束使用的索引。通过修改索引(例如,修改索引使用的填充因子),实质上可以删除并重新创建 PRIMARY KEY 或 UNIQUE 约束使用的索引,而无需删除并重新创建约束。有关重新生成索引的详细信息,请参阅重新组织和重新生成索引。
重新生成索引(而不是删除再重新创建索引)还有助于重新创建聚集索引。这是因为如果数据已经排序,则重新生成索引的过程无需按索引列对数据排序。
删除视图或表时,将自动删除为永久性和临时性视图或表创建的索引。
注意 |
---|
如果具有表的 ALTER 权限,就可以删除索引。 |
聚集索引
删除聚集索引后,存储在聚集索引叶级中的数据行将存储在未排序的表(堆)中。删除聚集索引会花些时间,这是因为除了删除聚集索引外,必须重新生成表的所有非聚集索引以替换带有指向堆的行指针的聚集索引键。删除表的所有索引时,首先删除非聚集索引,最后删除聚集索引。这样,就无需重新生成索引。有关聚集索引与非聚集索引之间关系的详细信息,请参阅非聚集索引结构。
联机删除操作期间或指定 MOVE TO 子句时,删除聚集索引需要临时磁盘空间。有关详细信息,请参阅索引 DDL 操作的磁盘空间要求。
删除索引视图的聚集索引时,将自动删除同一视图的所有非聚集索引和自动创建的统计信息。手动创建的统计信息不会删除。
使用 MOVE TO 子句
您可以通过指定 MOVE TO 选项,删除聚集索引以及将得到的未排序表(堆)移动到单个事务中的其他文件组或分区方案。MOVE TO 选项有以下限制:
这对于索引视图或非聚集索引无效。
指定的分区方案或文件组必须已经存在。
如果没有指定 MOVE TO,结果表将被放到为聚集索引定义的分区方案或文件组中。
联机删除聚集索引
删除聚集索引时,可以指定 ONLINE 选项。此选项设置为 ON 时,DROP INDEX 事务将不妨碍对基本数据和关联的非聚集索引进行查询和修改。有关详细信息,请参阅联机执行索引操作。
ONLINE 选项设置为 ON 时,有下列限制:
一次只能删除一个索引。
这对于禁用的聚集索引无效。
这对于视图的聚集索引,或表/视图的非聚集索引无效。
不能联机删除包含叶级数据行中的 text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max) 或 xml 列的聚集索引。
设置 MAXDOP 索引选项
对于删除索引操作,您可以通过指定 MAXDOP 索引选项,覆盖 sp_configure 的 max degree of parallelism 配置选项。有关详细信息,请参阅配置并行索引操作。
示例
A. 删除索引
下列示例删除了 ProductVendor 表中的 IX_ProductVendor_VendorID 索引。
USE AdventureWorks2008R2;
GO
DROP INDEX IX_ProductVendor_BusinessEntityID
ON Purchasing.ProductVendor;
GO
B. 在 ONLINE 模式中删除聚集索引
下列示例在 ONLINE 选项设置为 ON 时删除了一个聚集索引。未排序的结果表(堆)存储在该索引所在的文件组中。
USE AdventureWorks2008R2;
GO
DROP INDEX AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate
ON Production.BillOfMaterials WITH (ONLINE = ON, MAXDOP = 2);
GO