首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在“包含”列不同时为同一列创建索引的适当方法

在“包含”列不同时为同一列创建索引的适当方法
EN

Stack Overflow用户
提问于 2014-05-06 17:58:29
回答 2查看 1K关注 0票数 4

假设我有两个存储过程和一个表。

  • 表名:Table_A
  • 过程名称:proc1proc2

当我运行带有执行计划的proc1时,它建议我为Table_A for tblID (它不是主键)列创建一个索引,并建议包含column_Acolumn_B

proc2建议再次为Table_A创建一个索引,用于tblID列,但这一次它建议包括column_Bcolumn_C (这个过程建议column_C而不是column_A )。

因此,我的问题是,如果我创建了一个索引,其中包括所有建议的列,如:

代码语言:javascript
复制
CREATE NONCLUSTERED INDEX indexTest
ON [dbo].[Table_A] ([tblID])
INCLUDE ([column_A],[column_B],[column_C])

这会导致性能问题吗?

收集INCLUDE列有什么缺点吗?

或者我是否应该创建两个不同的索引:

代码语言:javascript
复制
CREATE NONCLUSTERED INDEX indexTest_1
ON [dbo].[Table_A] ([tblID])
INCLUDE ([column_A],[column_B])

CREATE NONCLUSTERED INDEX indexTest_2
ON [dbo].[Table_A] ([tblID])
INCLUDE ([column_B],[column_C])

更新:,我想在这个问题上再添加一件东西。

如果我也对主字段执行同样的操作:

我是说,

proc-1建议在tblID字段上创建一个索引。proc-2建议在tblIDcolumn_A上创建一个索引。

如果我把它们收集起来:

代码语言:javascript
复制
 CREATE NONCLUSTERED INDEX indexTest_3
    ON [dbo].[Table_A] ([tblID],[column_A])
    INCLUDE ([[column_B])

这会导致性能问题吗?还是应该为建议的主字段创建两个单独的索引?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-06 18:06:27

一定要创建包含所有三列的one索引!

索引越少,索引维护越好--索引维护是一个成本因素--更多的索引需要更多的维护。

所包含的列仅包含在索引的叶级中--这对性能的影响非常小。

Update:如果您在(tblID, column_A)上有一个索引,那么您可以将其用于在WHERE子句中只使用 tblID的查询,也可以用于在WHERE子句中使用两列的查询。

:但是,对于在WHERE子句中只使用 column_A的查询,此索引是无用的。一个复合索引(由多个列组成的索引)只有在给定的查询使用时才有用,这是索引中指定的n个最左边的列。

因此,在您的示例中,一个查询似乎表示tblID,而另一个查询则需要(tblID, column_A) --因此,在本例中,我认为(tblID, column_A)上的单一索引将适用于这两个查询。

票数 7
EN

Stack Overflow用户

发布于 2014-05-06 18:08:30

听起来你在看缺失指数dmvs。这里有几件事要意识到。dmvs确实告诉您一些特定的查询或类似于特定索引可能有帮助的组。

从这个意义上说,组合索引是正确的。这是正确的主意。

但是,也要记住索引是有代价的,衡量成本不是这个dmv的工作。您肯定不希望仅仅自动创建一个索引来覆盖每个推荐。您还需要检查这些索引:一旦包含了A、B和C列,是否将整个表(或几乎是这样)保存在索引中?您是否可以通过更改主键以匹配此索引来获得更好的结果?请仔细评估最后一部分,因为更改主键可能会将先前的键保留为更重要的缺失索引。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23501707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档