2011-03-02 54 views
2

综观上SQLServer中的缺失索引动态管理视图它表明我添加以下指标:指数与包括列或复合索引

CREATE INDEX [IXFoo] ON [a].[b].[MyTable] ([BarFlag]) INCLUDE ([BazID])

还有那迷惑我两件事情。

  • [BarFlag]是位字段。几乎没有高度的选择性,为什么要在一个位域上放一个索引?
  • 为什么不能在这种情况下,使用复合指数:CREATE INDEX [IXFoo] ON [a].[b].[MyTable] ([BarFlag],[BazID])

我想我没有正确理解INCLUDE关键字。我已经看过msdn的解释,但我仍然不清楚。

有人能解释为什么这个指标,建议在复合材料,并解释INCLUDE关键字给我吗?

回答

4

的主要区别是:

  • 如果您在(BarFlag, BazID)创建一个综合指数,那么你的指标将包含在索引B树的各个层面都值;这意味着,在做决策时查询分析器也将使用这两个值的机会,这可以支持在WHERE子句

    如果你创建(BarFlag)的指标,只有
  • 包括(BazID)同时指定列的查询,然后索引将包含在索引b树的各级仅BarFlag值,并且只在叶级,“最后”的水平,也会有包括的BazID值。 BazID值不能用于选择数据 - 它们只是出现在索引叶级查找。

只是一个INT和BIT不是太大的关注,但如果你正在处理一个VARCHAR(2000)列,你不能添加到实际索引(最大为900字节每个条目) - 但你可以包括它。

有,如果你选择了这两个值包含在索引中的列可能是有用的 - 那么,如果SQL Server找到了BarFlag匹配,它可以查找指数本身的叶级节点相应的BazID值它可以自行保存到实际数据页面(“书签查找”),以从数据页面获取该值。这可以是一个巨大的性能提升

你说得对 - 有一个索引只是BarFlag(BIT)真的没有意义 - 然后再次,DMV只建议索引 - 你不应该盲目遵循其所有建议 - 您仍然需要考虑并考虑这些建议是否合适(或不合理)。

1

INCLUDE关键字只是意味着其包含的列的值应该存储在索引本身,以便像查询如下:

SELECT BazID FROM MyTable WHERE BarFlag = @SomeValue 

这是没有必要做的额外查询表格本身以便在索引查找后找到值BazID