3

次の複合クラスター化インデックスを検討してください。

CREATE UNIQUE CLUSTERED INDEX ix_mytable ON mytable(a, b)

明らかに、 bに個別のインデックスを使用すると、 bの特定の値の検索が高速になります。

ただし、bの個別のインデックスが使用されていない場合でも、 aの離散値のツリーをトラバースして、テーブル スキャンの代わりにbの特定の値を持つタプルを見つけるために複合インデックスを使用できるように思えます。bのローカル検索、aの次の値へのジャンプなど。

これが SQL Server のしくみですか? (たとえば、MSSQL が複数の列を持つインデックスに単一のハッシュ値を使用する場合はそうではありません。)

それはそうであり、他の理由で複合インデックスがすでに必要であり、aの離散値の数が十分に少ない場合、パフォーマンス/スペースのトレードオフは、 bの個別のインデックスを持つことから遠ざかる可能性があります。

(上記の UNIQUE および CLUSTERED 制約は、この例では実際には必要ありませんが、 bの個別のインデックスを含まないbの最速の取得を表します -- 前者はaの各ループのショートカットを提供し後者は削除しますルックアップでの 1 度の間接参照)。

4

2 に答える 2

6

いいえ、「a」のクラスターを飛び越えることはありません。インデックスは、左端の列が指定されている場合にのみ使用できます。指定されていない場合は、フル スキャンを使用する必要があります。

Oracle には、いわゆる「Index Skip Scan」演算子があります。

于 2009-10-23T21:14:58.550 に答える