2011-11-28 116 views
3

可能重複:
Thoughts on index creation for SQL Server for missing indexes
T-SQL for finding Redundant Indexes查找並刪除重複的索引?

我使用SQL Server 2008和有一個包含了重複的索引超過150個表的數據庫。

我發現了一些將列出重複索引的sql腳本,但我不確定我是否應該信任它們。據說,他們說我有400多個重複索引;我不確定這是否正確,因此不想使用它們來自動刪除模糊。

我該如何明確定位重複索引並將其刪除?

+0

整理了在製備用於遷移,但你已經有兩個體面的答案。你可以試試嗎?如果您有可接受的答案,我寧願不遷移。 – Will

+0

@威爾:非常感謝我已經嘗試了他們兩個。但我仍在等待完美的答案。謝謝。 –

回答

4

查看Tom LaRock的優秀How to Find Duplicate Indexes博客文章 - 他詳細解釋瞭如何處理,還提供了檢測重複索引的腳本。

0

下面是代碼段,它將顯示重複索引,第二個查詢將返回相同的腳本。你只需要提供表名。對於實施例 組@tablename =「SalaryMaster」 這可以通過使用完成while循環上

select name from sys.tables 

放入臨時表應用而循環,並執行下面的代碼

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'''[email protected]+''') 
AND name = N'''+name+''') 
DROP INDEX ['+name+'] ON '[email protected]+' 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) 
+0

謝謝,但它工作不正常。我試過了,它忽略了一些重複的索引。 –

+0

Yakub,請你詳細說明重複索引。上面的查詢將爲您提供具有相同列名稱的索引。而已 。你是否想要這樣或不同。 – sameer

+0

我有兩個索引都在同一列column1 + column2,包含在兩個索引中的列是不同的,所以我想它應該列在重複列表中。 –