代码之家  ›  专栏  ›  技术社区  ›  ms5991

四列复合索引对三列查询有利吗?

  •  3
  • ms5991  · 技术社区  · 7 年前

    我有一张有柱子的桌子 A, B, C, D, E, ..., N . 具有 PK(A) . 我还为列定义了一个复合的、唯一的、非聚集索引。 D , C , B , A ,按照这个顺序。

    如果我使用这样的查询:

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

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

    3 回复  |  直到 7 年前
        1
  •  2
  •   Salman Arshad    7 年前

    是的,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'
    

    假设数据包含两个不同的活动值,类型为10,日期为1000,则 (Date, Type, Active, Other) 会比 (Active, Type, Date, Other) .

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

    PS:IF列 A 不在WHERE子句中使用,则可以简单地 INCLUDE 它。

        2
  •  2
  •   John Humphreys    7 年前

    是的,它仍然会正确地使用索引,使您的查询更加高效。

    把它想象成一个文本书中的嵌套目录:

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

    如果您只想进入二进制树部分,那么进入主题级别的内容不会对您造成任何伤害:)。

    现在。。。如果你想找到二叉树,却不知道它们是数据结构,那么这个目录对你来说就不是很有用了(例如,如果你缺少“d”)。

        3
  •  1
  •   Mark Sowul    7 年前

    是的,现在SQL可以只搜索那些记录,而不必扫描整个表。

    此外:

    1. 对于可能满足查询的行数,SQL将具有更好的统计信息(SQL将在组成索引的列集上自动创建统计信息)。
    2. 它是唯一的这一事实也将告诉SQL有关数据的信息,这可能会导致更好的计划(例如,如果您执行distinct或union,它将知道这些列已经是不同的)。
    3. SQL必须读取较少的数据,因为它不必读取所有“n”列(即使您只需要3列),而是可以读取索引,索引将有4列,因此只有一列是“多余的”。

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