2012-04-24 124 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]聚集索引將給予相同的順序物理佈局。