13

SQL Serverでテーブルにクラスター化インデックスがある場合、それはすべてのインデックス付きクエリがクラスター化インデックスを経由することを意味しますか?

たとえば、単一の非クラスター化インデックス(1つの列にインデックスを付ける)を持つテーブルがあり、その列を介して行を検索すると、次のようになります。Index Seek -> RID -> Data row lookup -> Result

しかし、別の列にクラスター化インデックスを追加すると、同じクエリで次のようになりますIndex Seek -> Extract clustering key -> Clustered index seek -> Results

これは、非クラスター化インデックスがリーフのRIDではなく、クラスター化インデックスのクラスター化キーで「終了」することを意味しますか?そうですか?

4

3 に答える 3

13

はい、あなたはそれをかなり理解しました。

クラスター化インデックスがある場合、非クラスター化インデックスには、クラスター化インデックスの列も実際のデータへの「ルックアップ」として含まれます。

非クラスター化インデックスで値を検索し、基になるデータの残りの列にアクセスする必要がある場合、SQL Serverはその非クラスター化インデックスからの「ブックマークルックアップ」(または「キールックアップ」)を実行します。クラスタ化インデックス(リーフレベルのノードにデータ自体が含まれています)。クラスタ化されたインデックスを使用すると、RIDは不要になります。したがって、RIDが変更された場合(データが1つのページから別のページに移動した場合)に、すべてのインデックスページを更新する必要はありません。

INCLUDEブックマークルックアップはかなりコストのかかる操作であるため、ステートメントを介して非クラスター化インデックスに列を追加できます。これにより、非クラスター化インデックスにはリーフレベルのページにそれらの追加の列が含まれ、そのデータセットに含まれる列のみが必要な場合は、非クラスター化インデックス自体からクエリを満たすことができます(この場合、これは「カバーリングインデックス」と呼ばれ、一連のブックマークルックアップを保存できます。

于 2010-09-14T17:14:44.613 に答える
1

いいえ。すべてのクエリがクラスター化インデックスを使用するわけではありません。クエリが非クラスター化インデックスによって「カバー」されている場合(クエリに必要なすべての列がNCインデックスに含まれている場合)、SQL Serverはそれらのインデックスページを読み取るだけで、ブックマークルックアップを実行する必要はありません。実際、NCインデックスは通常、クラスター化されたインデックスよりも小さいため、スキャンが高速であるため、オプティマイザーは可能な限りカバーするNCインデックスを使用することを好むことがよくあります。

于 2010-09-14T20:12:55.457 に答える
1

SQL Serverでテーブルにクラスター化インデックスがある場合、それはすべてのインデックス付きクエリがクラスター化インデックスを経由することを意味しますか?

いいえ。

クエリがセカンダリインデックスやクラスター化インデックスでカバーされるフィールドのみを使用する場合、セカンダリインデックスが優先される場合があります(おそらくそうなるでしょう)。

CREATE TABLE test (id INT NOT NULL PRIMARY KEY, value1 INT NOT NULL, value2 INT NOT NULL)

CREATE INDEX ix_test_value2 ON test (value2)

SELECT  value2, id
FROM    test

上記のクエリは、クエリに必要なすべての情報が含まれているため、おそらくを使用ix_test_value2しますが、サイズは小さくなります。

これは、非クラスター化インデックスがリーフのRIDではなく、クラスター化インデックスのクラスター化キーで「終了」することを意味しますか?そうですか?

はい、少し修正を加えました。

  • クラスタ化インデックスが一意でない場合、セカンダリインデックスの行ポインタは、クラスタ化されたキーと、と呼ばれる特別な非表示の列で構成されますuniquiefier(実際には、この列はクラスタ化インデックスにも追加されます)。

  • セカンダリインデックスがクラスター化インデックスの一部の列をカバーしている場合、クラスター化キーの欠落している部分のみが行ポインターとして追加されます。

  • セカンダリインデックスが宣言されている場合UNIQUE、クラスタ化されたキーはセカンダリインデックスのリーフレベルのレコードにのみ追加されます。

于 2010-09-14T20:23:16.160 に答える