【问题标题】:Duplicate index with and without include column包含和不包含包含列的重复索引
【发布时间】:2014-01-22 04:03:25
【问题描述】:

在使用Brent Ozarsp_BlitzIndex 脚本调查我的数据库时。我发现一些重复的索引问题 Multiple Index Personalities: Duplicate keys.

重复索引问题针对以下索引。

CREATE INDEX [IX_Business] ON [dbo].[tblMobile] ( [BusinessID] );
CREATE INDEX [IX_Comb_Marketing] ON [dbo].[tblMobile] ( [BusinessID] ) INCLUDE ( [MobileNo]);

这两个索引的区别是

INCLUDE ( [MobileNo]);

现在,我对如何解决重复索引问题感到困惑。我不能删除没有包含列的第一个索引,我可以删除包含列的索引吗?我是否需要在第一个索引中包含列 MobileNo 并且可以删除第二个?

如果我删除第二个并且不包含第一个索引中的列会有什么影响?

请帮助我。谢谢。

【问题讨论】:

  • 为什么不能删除第一个索引?使用它的查询仍然可以使用第二个索引。
  • 如果第一个索引是带有主键的簇索引怎么办?
  • 嗯,这不符合您问题中的CREATE INDEX 陈述。
  • 如果您删除第二个索引(包含列),那么如果您有一个使用BusinessID 查找行然后返回该ID 和MobileNo 的查询,现在,这个查询可以从索引中得到满足。如果您删除该索引,那么为了获得MobileNo 列,SQL Server 将不得不对基表进行昂贵的 键查找 并获得该列。因此,执行该特定查询将花费更长的时间
  • 那么聚集索引隐含地包括表中的所有列,所以第二个。尽管根据使用它的查询,如果 NCI 的叶级别要窄得多,则可能会同时保留两者。

标签: sql sql-server sql-server-2008 sql-server-2008-r2 indexing


【解决方案1】:

我会建议评估两个索引的 de seeks。注意从上次重新启动服务器的时间(统计信息将重置)。

评估搜索。

select  'TableName' = object_name(I.object_id)
, 'IndexName' = [I].[name] 
, U.user_seeks
 , U.user_scans
 , U.user_updates
 , U.last_user_seek
 , U.last_user_scan

         FROM sys.dm_db_index_usage_stats U
              INNER JOIN SYS.INDEXES AS I ON I.[OBJECT_ID] = U.[OBJECT_ID]
                                             AND I.INDEX_ID = U.INDEX_ID

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    相关资源
    最近更新 更多