当"包含"列不同时,为同一列创建索引的正确方法

cur*_*Boy 4 sql-server indexing sql-server-2008

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

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

当我运行proc1with执行计划时,它建议我为Table_Afor tblID(这不是主键)列创建索引并建议包含column_Acolumn_B.

proc2建议创建一个索引Table_A再次,对于tblID列,但这次它意味着包括column_Bcolumn_C(它暗示column_C,而不是column_A在此过程中)

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

CREATE NONCLUSTERED INDEX indexTest
ON [dbo].[Table_A] ([tblID])
INCLUDE ([column_A],[column_B],[column_C])
Run Code Online (Sandbox Code Playgroud)

这会导致任何性能问题吗?

收集INCLUDE列有什么不利之处吗?

或者我应该创建2个不同的索引:

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])
Run Code Online (Sandbox Code Playgroud)

更新:我想在这个问题上再补充一点.

如果我对主要字段做同样的事情:

我的意思是,

proc-1建议在tblID字段上创建索引.并且proc-2建议在tblID和上创建一个索引column_A.

如果我把它们收集起来:

 CREATE NONCLUSTERED INDEX indexTest_3
    ON [dbo].[Table_A] ([tblID],[column_A])
    INCLUDE ([[column_B])
Run Code Online (Sandbox Code Playgroud)

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

mar*_*c_s 7

绝对创建一个包含所有三列的索引!

您拥有的索引越少越好 - 索引维护是成本因素 - 更多索引需要更多维护.

并且包含的​​列仅包含在索引的叶级中 - 对性能的影响非常小.

更新:如果您有一个索引(tblID, column_A),则可以将此用于 tblID在其WHERE子句中使用的查询,或者您可以将其用于在其WHERE子句中同时使用这两列的查询.

但是:对于在其子句中使用的查询,此索引无效.如果给定查询使用索引中指定的n个最左列,则复合索引(由多列组成的索引)才有用. column_AWHERE

所以你的情况,一个查询似乎预示着tblID,而其他的需求(tblID, column_A)-所以是的,在这种情况下,我认为一个单一的指标(tblID, column_A)会为这两个查询工作.