假设我有一张这样的表:
a | b | c | d
______________
1 | 2 | 4 | 5
6 | 2 | 5 | 5
3 | 5 | 2 | 5
[a]
列具有聚集索引
所以它存储的物理顺序是:
a | b | c | d
______________
1 | 2 | 4 | 5
3 | 5 | 2 | 5
6 | 2 | 5 | 5
现在可以将[a]
索引增强为[a,c]
(仍然是群集)。
现在,由于[a]
列已经排序且[c]
列无法排序(因为[a]
的排序会对{[c]
的排序造成影响,因此无法保存它是如何存储的。 1}})
那么sqlServer将如何存储它?
2'问题:我是否需要为[c]
打开另一个索引?
答案 0 :(得分:2)
我认为你错过了一些明显的东西。考虑一下您对查询的期望
select * from myTable
order by [a], [c]
列[a,c]上的聚簇索引将给出具有相同顺序的物理布局。
答案 1 :(得分:1)
复合索引产生lexicographical order:当c
的值被视为“相等”时,记录会在a
上另外排序。
a c
1 2
2 3 -- Within this block, records are sorted on [c]
2 5 --
2 7 --
3 7
4 1
5 6 -- Within this block, records are sorted on [c]
5 8 --
这是字典排序的方式。
如果您希望加快不涉及c
的查询,则需要a
上的其他索引:
SELECT *
FROM mytable
WHERE c = @some_value