SQL Server:具有相同列性能的多个索引

时间:2011-08-04 14:26:45

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

我有一个表Person,其中包含personId, teamId, departmentId列。大多数查询都使用这些列的组合。

实施例

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

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

每列一个:SQL Server将使用Index Intersection

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

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

注意:

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

此外,最好将外键列索引并且任一策略都可以使用

答案 2 :(得分:0)

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

至于“我如何做这个新手”的答案,我会创建一个工作负载并使用调优顾问。它不是一个完整的解决方案,并且随着有人学到更多,他们超越了向导,但它是一个开始的好地方。确保你有一个不错的代表性样本,因为索引会破坏其他查询的性能,如果做错了。