【问题标题】:Multiple column indexes optimization for multiple column queries on SQL ServerSQL Server 上多列查询的多列索引优化
【发布时间】:2023-03-04 18:32:02
【问题描述】:

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

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

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

哪个更快:

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

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

【问题讨论】:

    标签: sql-server indexing


    【解决方案1】:

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

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

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

    更新

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

    【讨论】:

      【解决方案2】:

      视情况而定!

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

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

      【讨论】:

        猜你喜欢
        • 2012-07-31
        • 2015-08-19
        • 2011-12-31
        • 1970-01-01
        • 2012-08-08
        • 2014-01-09
        • 1970-01-01
        • 2018-11-05
        • 1970-01-01
        相关资源
        最近更新 更多