Sql server 为同一列创建索引的正确方法;包括「;列是不同的

Sql server 为同一列创建索引的正确方法;包括「;列是不同的,sql-server,sql-server-2008,indexing,Sql Server,Sql Server 2008,Indexing,假设我有2个存储过程和1个表 表名:表A 过程名称:proc1和proc2 当我使用执行计划运行proc1时,它建议我为tblID(不是主键)列的表A创建索引,并建议包括列A和列B 而proc2建议再次为Table\u A列创建索引,用于tblID列,但这次它建议包括column\u B和column\u C(对于此过程,它建议column\u C而不是column\u A) 所以我的问题是,如果我创建了一个包含所有建议列的索引,比如: CREATE NONCLUSTERED INDEX i

假设我有2个存储过程和1个表

  • 表名:
    表A
  • 过程名称:
    proc1
    proc2
当我使用执行计划运行
proc1
时,它建议我为
tblID
(不是主键)列的
表A
创建索引,并建议包括
列A
列B

proc2
建议再次为
Table\u A
列创建索引,用于
tblID
列,但这次它建议包括
column\u B
column\u C
(对于此过程,它建议
column\u C
而不是
column\u A

所以我的问题是,如果我创建了一个包含所有建议列的索引,比如:

CREATE NONCLUSTERED INDEX indexTest
ON [dbo].[Table_A] ([tblID])
INCLUDE ([column_A],[column_B],[column_C])
这会导致性能问题吗

收集
INCLUDE
列有什么缺点吗

或者我应该创建两个不同的索引,如下所示:

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建议在
tblID
列A
上创建索引

如果我将它们收集为:

 CREATE NONCLUSTERED INDEX indexTest_3
    ON [dbo].[Table_A] ([tblID],[column_A])
    INCLUDE ([[column_B])

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

肯定要创建一个包含所有三列的索引

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

所包含的列仅包含在索引的叶级中——这些列对性能的影响很小

更新:如果您在
(tblID,column_a)
上有一个索引,那么您可以将其用于在
WHERE
子句中仅使用的查询,或者您可以将其用于在
WHERE
子句中同时使用两列的查询

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


因此,在您的情况下,一个查询似乎表明
tblID
,而另一个查询需要
(tblID,column_A)
-因此,是的,在这种情况下,我认为
(tblID,column_A)
上的单个索引对这两个查询都有效。

听起来您正在查看。这里有几件事需要认识。DMV实际上是在告诉您特定的查询或类似的组,其中特定的索引可能会有所帮助

从这个意义上讲,组合索引是正确的。这是正确的想法


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

非常感谢@marc_sis,主字段的逻辑也一样吗?我的意思是一个程序建议为列A创建索引,另一个建议为tblID和列A创建索引。那么我是否也应该在主要字段中收集它们?@curiousBoy:如果这个答案有助于您理解和/或解决您的问题,那么请。这将表达你对那些花自己的时间帮助你的人的感激之情。对不起,我忘了,我完全专注于我的问题:)刚刚做到了。非常感谢。非常感谢Joel Coehoorn