【问题标题】:SQL Server: multiple index for the same columns performanceSQL Server:同一列的多个索引性能
【发布时间】:2011-10-20 01:38:43
【问题描述】:

我有一个表 Person 与列 personId, teamId, departmentId 等。大多数查询在 where 上使用这些列的组合。

例子

Select * from .. where personId = 2 and departementId = 1
Select * from .. where personId = 2 and teamId = 1   
Select * from .. where departmentId = 2 and teamId = 1   

我的问题是,我应该为这些列中的每一个单独创建一个索引吗?

【问题讨论】:

  • 实际查询不是Select *。我只是举个例子

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


【解决方案1】:

快速回答是肯定的 - 只需为每列添加一个索引。它不太可能是最佳解决方案,但在大多数情况下,它不会相差那么远,而且它可能不会造成任何伤害,除非您在该表上已经有很多索引。

唯一稍长一点的答案是您应该针对代表性数据测试您的查询 - SQL Server Database Engine Tuning Advisor 可以为您建议索引,但只有您可以检查确保这些索引适用于其他所有查询(包括插入/更新) - 您需要平衡读取性能与写入数据库时​​维护这些索引的成本(以及任何存储/空间限制)。

【讨论】:

    【解决方案2】:

    每列一个:SQL Server 将使用索引交集

    或者,尝试这样的事情:三个复合索引。每列的第一列也可用作“单列索引”。

    • departmentId, teamId, personId
    • personId, departmentId, teamId
    • teamId, personId, departmentId

    注意事项:

    • WHERE 子句顺序无关紧要
    • SELECT * 不好

    另外,为外键列建立索引是个好主意,这两种策略都可以工作

    【讨论】:

      【解决方案3】:

      通常,我不会为字段使用的变化创建 3 个索引,但这只是一般规则。

      至于“作为新手我该如何做”的答案,我会创建一个工作负载并使用调优顾问。这不是最终的解决方案,当有人了解更多时,他们会超越向导,但这是一个很好的起点。确保您有一个体面的代表性样本,因为如果索引操作不正确,可能会破坏其他查询的性能。

      【讨论】:

      • “索引会破坏其他查询的性能” - 有点笼统的说法。是的,它会影响 INSERTS,但即使是插入也需要找到插入点....
      • @Mitch Wheat:+1 每个 DML 都是一次读取,无论是查找行、检查唯一性还是检查 FK。我不太赞同“索引过多”理论
      • @gbn - 但是,当您有很多重叠时,您可能会遇到问题。如果您更新位于 3 个不同索引中的字段,则会开始成倍增加负面影响。
      • @Mitch:我想这里的总结是通过索引思考而不是仅仅实现。我不同意“索引太多”,尽管我同意你不能选择数字 X 太多。
      猜你喜欢
      • 2015-08-07
      • 2010-11-08
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      • 2018-11-05
      • 2010-12-04
      相关资源
      最近更新 更多