[英]SQL Server table index columns order
如果我以不同顺序使用列,则为更多列创建表索引时会有什么区别?
ID, isValid, Created
和ID, 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
和ID, Created, isValid
索引之间到底有什么区别?
如果您始终在
WHERE
子句中使用
所有三列,则没有区别。
( 正如马丁·史密斯 ( Martin Smith)在其评论中所指出的那样-由于条件不是相等检查,因此索引中各列的顺序确实很重要 )
但是:只有使用了最左边的n列(此处为1到3之间的n),才能使用索引。
因此,如果您的查询可能仅使用ID
和isValid
进行查询,则可以使用第一个索引-但肯定不会使用第二个索引。
如果你有使用的查询ID
和Created
作为他们的WHERE
参数,那么可以使用你的第二个指标,但第一个不能被使用。
AND
是可交换的,因此WHERE
中ANDed表达式的顺序无关紧要。 索引中列的顺序确实很重要,它应该与您的查询匹配。
如果ID
是表的群集主键,并且您的查询要求输入特定的ID
,则不必费心创建索引。 这就像给一本书的索引说“ 123页在123页上”等。
查询中的顺序没有区别。 索引中的顺序有所不同。 我不确定这在文本中看起来有多好,但是可以这样:
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)或任何其他顺序将进一步分离数据。 通常,您希望设计索引,以使最常执行的查询的数据尽可能“笨拙”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.