如何从一个数据库中删除所有索引,无论是集群还是非集群?
我需要用脚本来做到这一点,而不是通过 GUI。
已编辑
数据库有 7 个表,其中一些是查找表,一些是通过外键关联的。每个表都有最小的一个索引,在创建主键时创建,因此自动创建了约束。通过 GUI 删除此类索引时,我收到一个错误,即由于依赖于其他键而无法删除索引。
因此,我需要首先删除作为外键的索引键,然后在主键上创建索引。
如何从一个数据库中删除所有索引,无论是集群还是非集群?
我需要用脚本来做到这一点,而不是通过 GUI。
已编辑
数据库有 7 个表,其中一些是查找表,一些是通过外键关联的。每个表都有最小的一个索引,在创建主键时创建,因此自动创建了约束。通过 GUI 删除此类索引时,我收到一个错误,即由于依赖于其他键而无法删除索引。
因此,我需要首先删除作为外键的索引键,然后在主键上创建索引。
动态 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、唯一约束)。
创建一个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