如果我按不同的顺序使用列,我为更多列创建表索引有什么不同吗?
ID, isValid, Created
和ID, 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] )
答案 0 :(得分:2)
ID, isValid, Created
和ID, Created, isValid
指数之间的差异究竟是什么?
如果您始终在 WHERE
子句中使用所有三个列,则没有区别。
(正如Martin Smith在他的评论中指出的那样 - 由于标准不是等式检查,索引中列的顺序重要)
但是:如果使用n个最左侧的列(此处:n介于1和3之间),则只能使用索引。
因此,如果您的查询可能仅使用ID
和isValid
进行查询,则可以使用第一个索引 - 但第二个 从不肯定会被使用。
如果您的查询使用ID
和Created
作为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;尽可能最常执行的查询。