Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除不必要的索引-对SQL Server 2005中的查询计划的影响_Sql_Sql Server_Sql Server 2005_Indexing_Database Performance - Fatal编程技术网

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

删除不必要的索引-对SQL Server 2005中的查询计划的影响,sql,sql-server,sql-server-2005,indexing,database-performance,Sql,Sql Server,Sql Server 2005,Indexing,Database Performance,下面是我们在2MM记录表(SQLServer2005)上的索引混乱的一部分。很明显,我们有机会把它们说出来。这个表总共有16个索引,包括[MemberID]、[RegistryID]、[end_date]上的聚集PK,但我只列出了似乎需要合并的索引 例如,我很想放弃[ix_IndexName7],因为这是多余的。但是根据sys.dm\u db\u index\u usage\u stats 这是我的问题。比方说我放弃了[ix_IndexName7]或[ix_IndexName30](我认为[id

下面是我们在2MM记录表(SQLServer2005)上的索引混乱的一部分。很明显,我们有机会把它们说出来。这个表总共有16个索引,包括
[MemberID]、[RegistryID]、[end_date]
上的聚集PK,但我只列出了似乎需要合并的索引

例如,我很想放弃
[ix_IndexName7]
,因为这是多余的。但是根据sys.dm\u db\u index\u usage\u stats

这是我的问题。比方说我放弃了
[ix_IndexName7]
[ix_IndexName30]
(我认为
[idxmemberregistery1]
中涵盖了这一点)。当查询计划试图查找
[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])

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


在缓存中找不到有效的匹配查询计划,挂起的查询只会生成一个新的…

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

在讨论索引时,这些脚本肯定能方便地做出决定:

  • 也来自@Brent Ozar
  • 来自Jason Strate
  • 奥拉哈伦格伦酒店

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

我的建议:运行格伦超级酷列表中的查询4和查询5。。。。。。。。。。请记住,平衡性能的一部分是插入/更新/删除的成本。删除一些大大加快很少使用的查询速度的索引,例如年终报告,可能会在提高写操作性能方面获得值得的回报。从索引7回退到11可能对读取的影响最小,但会简化写入。这完全取决于您的数据和工作量。非常感谢大家!我会听取大家的意见。不幸的是,这个数据库是一个灾难性的区域,有数百个过时的对象,这是一个经常被引用的表,但我会尽可能彻底地测试它。就你的观点而言,@HABO,我了解了sys.dm\u db\u index\u usage\u stats.user\u updates列的含义,并肯定会将其纳入我的决策中。另外,考虑到我们在这台服务器上还有大约20GB的空间(叹气),大小与使用之间的权衡可能是相关的。很高兴我们能帮助Anna。别忘了把对你有用的答案作为正确答案进行核对,这样别人路过时就知道该去哪里看了。