2012-04-24 51 views
1

可以说,我有一个这样的表:SqlServer聚簇索引存储(> 1列)?

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](仍为聚簇)。

现在

,我不能udnerstand它如何可以存储,因为[a]列已经被排序,并[c]列不能进行排序(因为[a]排序伤害的[c]排序)

那么,如何SQLSERVER会保存它?

2'nd question:我是否需要打开另一个索引[c]

+0

这clusted指数(A或A&C)是独一无二的:

,如果你想加快查询不涉及a你需要c额外的指数? – 2012-04-24 11:05:27

回答

1

复合索引产生lexicographical order:当a的值被认为“相等”时,记录在c上额外订购。

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

这是字典排序的方式。

SELECT * 
FROM mytable 
WHERE c = @some_value 
+0

因此[c]将成为[a,c]索引的一部分,用于那些使用[a],[c] ............和[c]将具有另一个queriyes索引的查询只使用[c]? – 2012-04-24 11:03:31

+1

无论查询如何,'c'都将成为'(a,c)'上索引的一部分。对'a'和'c'(或仅对'a')进行过滤的查询将使用'(a,c)'上的索引;仅在'c'上过滤的查询只会在'c'上使用索引。 – Quassnoi 2012-04-24 11:07:53

+0

对于无关紧要的问题感到抱歉,bu ti真的想了解**决定**以创建索引。你有一个有用的链接?所有发现的链接都是关于索引的,而不是关于决定的...... – 2012-04-24 11:12:03

2

我觉得你错过了一些明显的东西。考虑一下你会从查询期望

select * from myTable 
order by [a], [c] 

你在列[A,C]聚集索引将给予相同的顺序物理布局。