【问题标题】:SQL Server table index columns orderSQL Server 表索引列顺序
【发布时间】:2014-07-25 10:49:44
【问题描述】:

如果我以不同的顺序使用列,为更多列创建表索引时有什么不同吗?

ID, isValid, CreatedID, Created, isValid 索引之间到底有什么区别?

查询顺序有什么区别吗?

where ID = 123 
  and isValid = 1 
  and Created < getdate()

对比

where ID = 123 
  and Created < getdate() 
  and isValid = 1

列类型:ID [int]、isValid [bit]、Created [datetime])

【问题讨论】:

  • 你会想要ID, isValid , Created。所以寻找前两列。

标签: sql sql-server indexing query-performance


【解决方案1】:

ID, isValid, CreatedID, Created, isValid 索引之间到底有什么区别?

如果您始终在WHERE 子句中使用所有三个列 - 没有区别。
正如 Martin Smith 在他的评论中指出的那样 - 由于标准不是相等性检查,因此索引中列的顺序确实很重要

但是:只有在使用了最左边的 n 列(这里:n 介于 1 和 3 之间)时,才能使用索引。

因此,如果您的查询可能仅使用 IDisValid 进行查询,则可以使用第一个索引 - 但第二个索引永远不会 一定要使用。

如果您有使用IDCreated 作为WHERE 参数的查询,那么可能可以使用第二个索引,但永远不能使用第一个索引。 p>

【讨论】:

  • 这里确实有所不同,因为它们并不都是相等的谓词。
  • @MartinSmith:是吗?你能进一步解释(或指出解释)吗?那么这两个索引中的哪一个更适合 - 最后一个不等式列 Created
  • 是的。您希望在最后创建以最大限度地提高效率。如果是在开始时,您只需在&lt; GetDate 上进行范围搜索并扫描不一定与其他两个谓词匹配的行负载。如果最后你可以对那些进行相等搜索,那么只需对匹配的行进行范围搜索。
  • 因此,如果您将所有三个比较都与 平等 - 那么我的 没有区别 的陈述是否正确?
【解决方案2】:

AND 是可交换的,因此WHERE 中的 AND 表达式的顺序无关紧要。 索引中列的顺序确实很重要,它应该与您的查询匹配。

如果ID 是您的表的聚集主键并且您的查询要求特定的ID,请不要费心创建索引。这就像给一本书提供索引,上面写着“第 123 页在第 123 页”等等。

【讨论】:

    【解决方案3】:

    查询中的顺序没有区别。索引中的顺序会有所不同。我不确定这在文本中看起来有多好,但这里是:

    where ID = 123 and isValid = 1 and Created < Date 'Jan 3'
    

    这里有几个可能的索引:

    ID   IsValid Created
    ===  ======= =========
    122  0       Jan 4
    122  0       Jan 3
    ...  ...     ...
    123  0       Jan 4
    123  0       Jan 3
    123  0       Jan 2
    123  0       Jan 1
    123  1       Jan 4
    123  1       Jan 3
    123  1       Jan 2 <-- Your data is here...
    123  1       Jan 1 <-- ... and here
    ...  ...     ...
    
    ID   Created IsValid
    ===  ======= ========
    122  Jan 4   0
    122  Jan 4   1
    ...  ...     ...
    123  Jan 4   0
    123  Jan 4   1
    123  Jan 3   0
    123  Jan 3   1
    123  Jan 2   0
    123  Jan 2   1     <-- Your data is here...
    123  Jan 1   0
    123  Jan 1   1     <-- ... and here
    ...  ...     ...
    

    正如您可能知道的那样,创建索引(IsValid, Created, ID)或任何其他顺序会更加分离您的数据。通常,您希望设计索引以使您的数据对于最常执行的查询尽可能“成块”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-25
      • 2014-01-09
      • 2014-01-06
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多