【问题标题】:Does a 4-column composite index benefit a 3-column query?4 列复合索引是否有利于 3 列查询?
【发布时间】:2019-02-15 03:34:29
【问题描述】:

我有一个包含A, B, C, D, E, ..., N 列的表格。与PK(A)。我还为列DCBA 按此顺序定义了一个复合的、唯一的、非聚集索引。

如果我使用如下查询:

where D = 'a' and C = 'b' and B = 'c'

如果没有 A 子句,我还能获得索引的好处吗?

【问题讨论】:

  • 是的,你得到了好处。如果你没有 D 的子句,那么你就不会
  • 嗯。您是否尝试创建索引并查看执行计划?它会准确地告诉您使用了哪些索引以及如何使用。

标签: sql sql-server database indexing


【解决方案1】:

是的,现在 SQL 可以只查找这些记录,而不必扫描整个表。

另外:

  1. SQL 将有更好的统计信息(SQL 将自动创建关于构成索引的列集的统计信息)关于有多少行可能满足您的查询
  2. 它是 UNIQUE 的事实也会告诉 SQL 有关数据的信息,这可能会产生更好的计划(例如,如果您执行 DISTINCT 或 UNION,它将知道这些列已经是不同的)。
  3. SQL 将不得不读取更少的数据,因为不必读取所有“N”列(即使您只需要 3 个),它可以读取索引,该索引将有 4 个,因此只有一个将是“多余的” .

请注意,由于所讨论的特定查询是 D、C 和 B 上的 WHERE,因此在这种情况下,索引的顺序无关紧要。如果 WHERE 子句仅在 C 和 B 上,您将获得更少的好处,因为 SQL 将不再能够在 D 上查找,并且上面的 (1) 和 (2) 将不适用。 (3) 不过还是会。

【讨论】:

    【解决方案2】:

    是的,它仍然会正确使用索引并使您的查询更有效率。

    把它想象成教科书中的嵌套目录:

    • 略读直到看到章节名称(例如“数据结构”)
      • 浏览直到看到相关的章节标题(“二叉树”)
        • 略读直到看到相关主题(例如“堆”)。

    如果您只想进入二叉树部分,那么进入主题级别的内容根本不会伤害您:)。

    现在...如果您想查找二叉树并且您不知道它们是一种数据结构,那么此目录对您来说不会很有用(例如,如果您缺少“D”)。

    【讨论】:

      【解决方案3】:

      是的,SQL Server 可以针对这些查询对索引(D, C, B, A) 执行查找操作:

      WHERE D = 'd'
      WHERE D = 'd' AND C = 'c'
      WHERE D = 'd' AND C = 'c' AND B = 'b'
      WHERE D = 'd' AND C = 'c' AND B = 'b' AND A = 'a'
      

      它可以对这些索引执行扫描操作:

      WHERE C = 'c' AND B = 'b'
      WHERE A = 'a'
      -- etc
      

      但还有一件事需要考虑:索引中列的顺序很重要。可能有两个索引 (D, C, B, A)(B, C, D, A) 执行不同。考虑以下示例:

      WHERE Active = 1 AND Type = 2 AND Date = '2019-09-10'
      

      假设数据包含两个不同的 Active 值、10 的 Type 和 1000 的 Date,(Date, Type, Active, Other) 上的索引将比 (Active, Type, Date, Other) 更有效。

      您还可以考虑为不同的查询创建所述索引的不同变体。

      PS:如果在 WHERE 子句中没有使用列 A,那么您可以简单地 INCLUDE 它。

      【讨论】:

        猜你喜欢
        • 2023-01-23
        • 2012-03-29
        • 1970-01-01
        • 2016-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-14
        • 2013-08-23
        相关资源
        最近更新 更多