删除特定数据库的所有索引

时间:2013-02-06 23:44:16

标签: sql sql-server indexing

如何从一个数据库中删除所有索引,无论是聚簇还是非聚簇?

我需要使用脚本而不是GUI。

EDITED

数据库有7个表,其中一些是查找,有些是通过外键相关的。每个表都有一个最小的索引,在创建主键时及时创建,因此自动创建了约束。当通过GUI删除这些索引时,我收到一个错误,即由于依赖于其他键而无法删除索引。

因此,我需要首先删除作为外键的索引键,然后删除在主键上创建的索引。

2 个答案:

答案 0 :(得分:13)

动态SQL的变化略有不同,但它首先丢弃外键,然后是主键,然后是索引(首先是非聚簇索引,这样就不会转换为堆(这会影响所有非群集)索引))。

USE specific_database;
GO

首先,删除所有外键:

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'';

SELECT @sql = @sql + N'ALTER TABLE ' 
  + QUOTENAME(OBJECT_SCHEMA_NAME([parent_object_id]))
  + '.' + QUOTENAME(OBJECT_NAME([parent_object_id])) 
  + ' DROP CONSTRAINT ' + QUOTENAME(name) + ';
'
FROM sys.foreign_keys
WHERE OBJECTPROPERTY([parent_object_id], 'IsMsShipped') = 0;

EXEC sp_executesql @sql;

现在删除主键:

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'';

SELECT @sql = @sql + N'ALTER TABLE '
  + QUOTENAME(OBJECT_SCHEMA_NAME([parent_object_id]))
  + '.' + QUOTENAME(OBJECT_NAME([parent_object_id])) 
  + ' DROP CONSTRAINT ' + QUOTENAME(name) + ';
'
FROM sys.key_constraints 
WHERE [type] = 'PK'
AND OBJECTPROPERTY([parent_object_id], 'IsMsShipped') = 0;

EXEC sp_executesql @sql;

最后,索引,非聚集的第一个:

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'';

SELECT @sql = @sql + N'DROP INDEX ' 
  + QUOTENAME(name) + ' ON '
  + QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
  + '.' + QUOTENAME(OBJECT_NAME([object_id])) + ';
'
FROM sys.indexes 
WHERE index_id > 0
AND OBJECTPROPERTY([object_id], 'IsMsShipped') = 0
ORDER BY [object_id], index_id DESC;

EXEC sp_executesql @sql;

请注意,数据库引擎优化顾问会推荐一堆这些索引(并且根据您提供的工作负载,可能会遗漏一些索引,并且可能会建议冗余和几乎重复的索引)。但是,它不会推荐您刚刚删除的任何数据完整性内容(PK,FK,唯一约束)。

答案 1 :(得分:5)

创建Dynamic SQL

DECLARE @qry nvarchar(max);
SELECT @qry =  (SELECT  'DROP INDEX ' + ix.name + ' ON ' + OBJECT_NAME(ID) + '; '
                FROM  sysindexes ix
                WHERE   ix.Name IS NOT NULL AND 
                        ix.Name LIKE '%prefix_%'
                FOR XML PATH(''));
EXEC sp_executesql @qry