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

Posted

技术标签:

【中文标题】SQL Server 上多列查询的多列索引优化【英文标题】:Multiple column indexes optimization for multiple column queries on SQL Server 【发布时间】:2011-05-10 19:14:29 【问题描述】:

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

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

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

哪个更快:

    创建两个索引,每列一个。 ([column1] 和 [column2]) 创建一个包含两列的索引。 ([column1]+[column2])

这个问题困扰了我一段时间,我不知道查询优化是如何工作的,以及 SQL Server 如何使用创建的索引来加速查询。

【问题讨论】:

【参考方案1】:

对于此查询,第二个总是更快-但您需要将更具选择性的一个放在第一位(按索引的顺序)才能获得更多收益。唯一的例外是如果出于性能原因,SQL 决定使用聚集索引,因此会忽略非聚集索引。

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

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

更新

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

【讨论】:

【参考方案2】:

视情况而定!

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

如果您没有选择所有列“*”,则可以使用一个非常快速的覆盖索引,它由 where 子句列和 SELECT 列表中的列包含。

【讨论】:

以上是关于SQL Server 上多列查询的多列索引优化的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 中多列非聚集索引中的列顺序是不是重要?

DataFrame查询2 - 专用查询:索引和切片

SQL 子查询,索引优化

mysql单列索引多列索引的使用

SQL优化 总结 精简

如何在多列上创建索引