【问题标题】:Proper way of creating indexes for same column when "include" columns are different当“包含”列不同时为同一列创建索引的正确方法
【发布时间】:2014-05-06 17:58:29
【问题描述】:

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

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

当我使用执行计划运行proc1 时,它建议我为tblID(不是主键)列创建Table_A 的索引,并建议包括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])

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

收集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])

更新:我想为这个问题再补充一件事。

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

我的意思是,

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

如果我将它们收集为:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    所以在你的情况下,一个查询似乎表明tblID,而另一个需要(tblID, column_A) - 所以是的,在这种情况下,我认为(tblID, column_A) 上的单个索引 会适用于两个查询。

    【讨论】:

    • 主字段的逻辑是否也相同?我的意思是一个 proc 建议为 column_A 创建一个索引,另一个建议为 tblID 和 column_A 创建一个索引。那么我是否也应该在主要领域也收集它们?
    • @curiousBoy:如果这个答案帮助你理解和/或解决你的问题,那么请accept this answer。这将表达您对花费自己的时间帮助您的人们的感激之情。
    • 对不起,我忘记了,我完全专注于我的问题 :) 刚刚做到了。谢谢!
    【解决方案2】:

    听起来您正在查看missing index dmvs。这里有几件事要实现。 dmvs 确实在告诉您特定索引可能有帮助的特定查询或类似组。

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

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

    【讨论】:

    • 非常感谢@Joel Coehoorn
    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2017-02-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多