我有一个表[table],其中有两列需要过滤:[column1]和[column2]。
在我的程序中,我执行如下查询:
select * from [table] where [column1] = 'foo' and [column2] = 'bar';
哪个更快:
这个问题一直困扰着我,我不知道查询优化是如何工作的,以及SQL Server如何使用创建的索引来加速查询。
答案 0 :(得分:3)
取决于!
这取决于这些列的选择性。
如果你不选择所有列'*',你可能能够利用一个非常快速的覆盖索引,包括where子句列和INCLUDE在SELECT列表中的列。
答案 1 :(得分:3)
对于此查询,第二个始终更快 - 但您需要先将更具选择性的一个(按索引的顺序)更多地受益。唯一的例外是,出于性能原因,SQL决定使用聚簇索引,因此忽略非聚簇索引。
两个值的组合创建了更具选择性的标准。此外,它还有助于提高性能,因为覆盖索引上不需要BOOKMARK LOOKUP。
书签查找是主要性能下降的原因,这就是覆盖索引始终优于2个索引的原因。
<强>更新强>
请记住,如果您的索引为column1 + coulmn2,则只对column2的搜索不能使用此索引,因此您还需要在column2上使用单独的索引。