2

テーブルを作成しました

create table #temp(a int, b int, c int)

このテーブルには 2 つのインデックスがあります。

  1. c 上の非クラスタ化非一意インデックス
  2. 上のクラスター化インデックス

次のクエリを実行しようとすると:

select b from #temp where c = 3

システムがインデックス スキャンを行っていることがわかります。非クラスター化インデックスにはキー値として b がないため、これで問題ありません。したがって、列 a からインデックス スキャンを実行します。

しかし、以下のクエリを実行しようとすると:-

select b from #temp where c= 3 and a = 3

実行計画にはインデックス シークしかないことがわかります。スキャンなし。何故ですか?

クラスター化インデックスも非クラスター化インデックスも、列の 1 つとして b として使用されませんか?

インデックススキャンを期待していました。

どうか明らかにしてください

4

2 に答える 2

5

クラスタリングキーとして持っている場合a、その列はそのテーブルのすべての非クラスタリングインデックスに含まれます。

したがって、上のインデックスには、cも含まれaているため、条件

where c= 3 and a = 3

インデックスシークを使用して、そのインデックスで見つけることができます。ほとんどの場合、クエリオプティマイザは、インデックスシークを実行して残りのデータを取得するためにキールックアップを実行する方が、インデックススキャンを使用するよりも高速/効率的であるとa判断しました。c

ところで:なぜインデックスシークよりもインデックススキャンを期待/好んだのですか?インデックスシークは通常、より高速で、使用するリソースがはるかに少なくなります。スキャンよりもインデックスシークを取得するように常に努力します。

于 2012-04-08T07:25:00.710 に答える
0

非クラスター化インデックスにはキー値として b がないため、これで問題ありません。したがって、列 a からインデックス スキャンを実行します。

この仮定は正しくありません。インデックスのシークとスキャンは、select 句ではなく WHERE 句を処理する必要があります。

今あなたの質問 -

where句はsqlオプティマイザで最適化され、a=3の条件があるのでクラスタ化インデックスを適用できます。

于 2012-04-08T09:12:52.790 に答える