SQL Server上多列查询的多列索引优化

时间:2010-11-16 12:40:58

标签: sql-server indexing

我有一个表[table],其中有两列需要过滤:[column1]和[column2]。

在我的程序中,我执行如下查询:

select * from [table] where [column1] = 'foo' and [column2] = 'bar';

哪个更快:

  1. 创建两个索引,每列一个。 ([column1]和[column2])
  2. 创建包含两列的索引。 ([列1] + [列2])
  3. 这个问题一直困扰着我,我不知道查询优化是如何工作的,以及SQL Server如何使用创建的索引来加速查询。

2 个答案:

答案 0 :(得分:3)

取决于!

这取决于这些列的选择性。

如果你选择所有列'*',你可能能够利用一个非常快速的覆盖索引,包括where子句列和INCLUDE在SELECT列表中的列。

答案 1 :(得分:3)

对于此查询,第二个始终更快 - 但您需要先将更具选择性的一个(按索引的顺序)更多地受益。唯一的例外是,出于性能原因,SQL决定使用聚簇索引,因此忽略非聚簇索引。

两个值的组合创建了更具选择性的标准。此外,它还有助于提高性能,因为覆盖索引上不需要BOOKMARK LOOKUP

书签查找是主要性能下降的原因,这就是覆盖索引始终优于2个索引的原因。

<强>更新

请记住,如果您的索引为column1 + coulmn2,则只对column2的搜索不能使用此索引,因此您还需要在column2上使用单独的索引。