SqlServer聚集索引存储(> 1列)?

时间:2012-04-24 10:37:53

标签: sql-server sql-server-2008 indexing clustered-index

假设我有一张这样的表:

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]打开另一个索引?

2 个答案:

答案 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