SQL Server表索引列顺序

时间:2014-07-25 10:49:45

标签: sql sql-server indexing query-performance

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

ID, isValid, CreatedID, Created, isValid指数之间的差异究竟是什么?

查询顺序有什么不同吗?

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

VS。

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

列类型:ID [int] ,isValid [bit] ,创建 [datetime]

3 个答案:

答案 0 :(得分:2)

  

ID, isValid, CreatedID, Created, isValid指数之间的差异究竟是什么?

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

但是:如果使用n个最左侧的列(此处:n介于1和3之间),则只能使用索引。

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

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

答案 1 :(得分:1)

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

如果ID是您的表的群集主键,并且您的查询要求特定的ID,请不要打扰创建索引。这就像给一本书的索引说“页面123在第123页”等。

答案 2 :(得分:1)

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

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)或任何其他订单会更加分离您的数据。通常,您希望设计索引以使您的数据成为&#34; clumpy&#34;尽可能最常执行的查询。