查找和删除重复的索引?

3

可能是重复的问题:
SQL Server索引的创建思路以及缺失索引的查询
查找多余索引的T-SQL语句

我正在使用 SQL Server 2008,并且拥有一个包含超过150个表的数据库,其中有一些是重复的索引。

我找到了一些 SQL 脚本可以列出这些重复的索引,但我不确定是否应该相信它们。据说,它们会告诉我有400多个重复的索引;我不确定这是否正确,因此不想使用它们来自动删除冗余索引。

那么我如何确认重复的索引并将其删除呢?


为了迁移做好了清理工作,但是你已经有两个不错的答案了。你能试一下吗?如果你有一个可接受的答案,我宁愿不进行迁移。 - user1228
@Will:非常感谢,我已经尝试过它们两个了。但是我还在等待完美的答案。谢谢。 - Yaqub Ahmad
2个回答

4

请查看Tom LaRock的博客文章如何查找重复索引 - 他详细解释了如何进行操作,并提供了检测重复索引的脚本。


0
以下是一个代码片段,它将显示重复索引,第二个查询将返回相同的脚本。你只需要提供表名。例如: set @TableName = 'SalaryMaster' 这可以通过在while循环中使用来完成。
select name from sys.tables

将其放入临时表中,应用while循环,并执行以下代码。
declare @TableName as varchar(50)

set @TableName = 'EmployeeMaster'
--- 1. 
select name as IndexName,Index_id as IndexID from sys.indexes 
where index_id  NOT in (
select MIN(index_id)  from (
select avg(column_id) avgCol,index_id  from sys.index_columns where
 object_id = object_id(@TableName)
group by index_id 
) as a group by avgCol  
) and object_id = object_id(@TableName)

--- 2.     
select '
IF  EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'''+@TableName+''') 
AND name = N'''+name+''')
DROP INDEX ['+name+'] ON '+@TableName+' WITH ( ONLINE = OFF )
' from sys.indexes 
where index_id  NOT in (
select MIN(index_id)  from (
select avg(column_id) avgCol,index_id  from sys.index_columns where
 object_id = object_id(@TableName)
group by index_id 
) as a group by avgCol  
) and object_id = object_id(@TableName)

谢谢你,但它并没有正确工作。我尝试了一下,它忽略了一些重复的索引。 - Yaqub Ahmad
Yakub,您能否详细说明重复索引。上面的查询将给出具有相同列名称的索引。就是这样。您想要这样还是不同的? - sameer
我有两个索引,都在相同的列column1 + column2上,这两个索引包含的列不同,所以我猜应该将其列入重复列表。 - Yaqub Ahmad
yakub sys.indexes 是一个系统视图,它列出了数据库中的所有索引。sys.index_columns 列出了所有带有列名的索引。 - sameer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接