删除不必要的索引 - 影响SQL Server 2005中的查询计划

时间:2013-05-03 21:02:56

标签: sql sql-server sql-server-2005 indexing database-performance

下面是我们在2MM记录表(SQL Server 2005)上的索引混乱的一部分。显然,有机会让他们失望。这个表共有16个索引,包括[MemberID], [RegistryID],[end_date]上的聚簇PK,但我只列出了似乎是合并的候选者。

我很想放弃[ix_IndexName7]例如,因为它是多余的。但根据sys.dm_db_index_usage_stats,它似乎是在某个查询计划或其他计划中。

这是我的问题。假设我放弃[ix_IndexName7][ix_IndexName30](我认为[idxMemberRegistry1]涵盖了这一点)。当查询计划尝试查找[ix_IndexName7]而不能查找时,优化程序是否会神奇地合并其中一个第一列为[MemberID]的其他索引?或者我将不得不找到使用该表的任何SP /视图/函数并重新编译它们(这可能很糟糕,因为可能存在垃圾邮件)。或其他什么?

我希望这个问题很明确。我很感激任何意见!

CREATE NONCLUSTERED INDEX [idx_RegistryID] ON [dbo].[Member_Registry] ([RegistryId], [end_date], [MemberId])
CREATE UNIQUE NONCLUSTERED INDEX [idx_MemberID] ON [dbo].[Member_Registry] ([MemberId], [RegistryId], [end_date]) INCLUDE ([Due_Date])
CREATE NONCLUSTERED INDEX [ix_IndexName7] ON [dbo].[Member_Registry] ([end_date]) INCLUDE ([MemberId])
CREATE NONCLUSTERED INDEX [ix_IndexName11] ON [dbo].[Member_Registry] ([end_date]) INCLUDE ([MemberId], [RegistryId])
CREATE NONCLUSTERED INDEX [ix_IndexName16] ON [dbo].[Member_Registry] ([end_date]) INCLUDE ([ContinuousEnrol], [MemberId], [RegistryId])
CREATE NONCLUSTERED INDEX [ix_IndexName30] ON [dbo].[Member_Registry] ([end_date]) INCLUDE ([MemberId], [P4P_Patient], [RegistryId])
CREATE NONCLUSTERED INDEX [ix_IndexName29] ON [dbo].[Member_Registry] ([end_date], [ContinuousEnrol]) INCLUDE ([MemberId], [RegistryId])
CREATE NONCLUSTERED INDEX [idxMemberRegistry1] ON [dbo].[Member_Registry] ([end_date], [MemberId], [RegistryId]) INCLUDE ([COL_D2yr], [ContinuousEnrol], [P4P_AAB], [P4P_ACE], [P4P_CERVICAL], [P4P_Chlamydia], [P4P_COL], [P4P_DGX], [P4P_DIU], [P4P_MAMMO], [P4P_Patient], [start_date])
CREATE NONCLUSTERED INDEX [idx_AllPatients] ON [dbo].[Member_Registry] ([MemberId], [RegistryId], [end_date]) INCLUDE ([EXCLUSION_STATUS], [P4P_Patient])
CREATE NONCLUSTERED INDEX [idx_Exclusion_Status] ON [dbo].[Member_Registry] ([MemberId], [RegistryId], [EXCLUSION_STATUS])

2 个答案:

答案 0 :(得分:2)

如果删除一些索引并再次运行查询,它将重新编译一个新的执行计划,可能会使用其余的一些索引,也许不会。是一个测试的问题,看看哪个行动会有所帮助,相反,会破坏所有的表现。

这些脚本肯定会在谈论索引时做出决定:

它们共同提供了有关索引的当前状态,重复项,未使用的,统计信息,等待状态,I / O使用等的大量信息。根据这些信息,您可以进行更有效的分析,并选择最佳选择。

答案 1 :(得分:0)

当其来源发生某些类型的更改时,查询计划无效。这将包括删除它正在使用的任何索引。未使用未经验证的查询计划。

未能在缓存中找到有效的匹配查询计划,待处理的查询只会创建一个新的...