SQL Server 2008 で次のクエリを実行します。
SELECT *
FROM Dealers WITH (INDEX(0))
WHERE ID = 'rrsdsd'
しかし、実行計画は、テーブルのクラスター化インデックスを使用したことを示しています。
なんでそうなの?
SQL Server 2008 で次のクエリを実行します。
SELECT *
FROM Dealers WITH (INDEX(0))
WHERE ID = 'rrsdsd'
しかし、実行計画は、テーブルのクラスター化インデックスを使用したことを示しています。
なんでそうなの?
ドキュメントはそれをすべて言います...
INDEX(index_value [、。。。n])| INDEX =(index_value)INDEX()構文は、ステートメントを処理するときにクエリオプティマイザが使用する1つ以上のインデックスの名前またはIDを指定します。代替のINDEX=構文は、単一のインデックス値を指定します。テーブルごとに指定できるインデックスヒントは1つだけです。
クラスタ化インデックスが存在する場合、INDEX(0)はクラスタ化インデックススキャンを強制し、INDEX(1)はクラスタ化インデックススキャンまたはシークを強制します。クラスタ化インデックスが存在しない場合、INDEX(0)はテーブルスキャンを強制し、INDEX(1)はエラーとして解釈されます。
1つのヒントリストで複数のインデックスが使用されている場合、重複は無視され、リストされている残りのインデックスはテーブルの行を取得するために使用されます。インデックスヒント内のインデックスの順序は重要です。複数のインデックスヒントもインデックスのAND演算を適用し、クエリオプティマイザはアクセスされる各インデックスに可能な限り多くの条件を適用します。ヒント付きインデックスのコレクションにクエリで参照されるすべての列が含まれていない場合、SQL Serverデータベースエンジンがすべてのインデックス付き列を取得した後、フェッチが実行されて残りの列が取得されます。
SQL Server に伝えていることは、インデックスを使用せずにクエリを実行することです。したがって、クエリ プランには、使用されているクラスター化インデックスが表示されると予想されますが (これはデータであるため)、シークではなくスキャンが実行されます。これは事実ですか?
ドキュメントによると:
クラスター化インデックスが存在する場合、INDEX(0) はクラスター化インデックス スキャンを強制し、INDEX(1) はクラスター化インデックス スキャンまたはシークを強制します。
これはまさにあなたが見ているものです。