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](クラスター化されたまま)にします。

[a]現在、列はすでに並べ替えられており、列は並べ替えられないため、どのように保存できるかわかりません[c](並べ替えは並べ替えに[a]悪影響を与えるため[c]

では、sqlServerはそれをどのように保存しますか?

2番目の質問:別のインデックスを開く必要があり[c]ますか?

4

2 に答える 2

2

明らかな何かが欠けていると思います。クエリから何を期待するかを検討します

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

列[a、c]のクラスター化インデックスは、同じ順序の物理レイアウトを提供します。

于 2012-04-24T10:52:57.833 に答える
1

複合インデックスは辞書式順序を生成します。レコードは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
于 2012-04-24T11:01:01.003 に答える