テーブル スキャン、クラスター化インデックス スキャン、およびインデックス シークが何であるかは知っていますが、Google のスキルでは、非クラスター化インデックス スキャンの正確な説明を見つけることができませんでした。クエリが非クラスター化インデックス スキャンを使用する理由と時期は?
ありがとうございました。
テーブル スキャン、クラスター化インデックス スキャン、およびインデックス シークが何であるかは知っていますが、Google のスキルでは、非クラスター化インデックス スキャンの正確な説明を見つけることができませんでした。クエリが非クラスター化インデックス スキャンを使用する理由と時期は?
ありがとうございました。
名前が示すように、非クラスター化インデックス スキャンは非クラスター化インデックスのスキャンです。NCI スキャンは通常、選択のすべてのフィールドを非クラスター化インデックスから満たすことができる場合に実行されますが、クエリの選択性またはインデックス作成が過剰な場合に実行されます。シークが発生しにくい。
NCI スキャンは、クラスター化インデックス スキャンよりもパフォーマンスが向上する可能性があります。NCI インデックスは通常、クラスター化インデックスよりも幅が狭く (列数が少ないため)、フェッチするページが少なくなり、I/O が少なくなります。
SqlFiddle Hereに不自然なシナリオを掲載しました。下部にある [実行計画の表示] をクリックします。
テーブル、クラスター化、および非クラスター化インデックスの次の設定があるとします。
CREATE TABLE Foo
(
FooId INT,
Name VARCHAR(50),
BigCharField CHAR(7000),
CONSTRAINT PK_FOO PRIMARY KEY CLUSTERED(FooId)
);
CREATE NONCLUSTERED INDEX IX_FOO ON Foo(Name);
次のクエリは、さまざまなスキャンを示しています。
-- Clustered Index Scan - because we need all fields, CI is most efficient
SELECT * FROM FOO;
-- Non Clustered Index Scan - because we just need Name, but have no selectivity, the NCI
-- will suffice and is narrower.
SELECT DISTINCT(Name) FROM FOO;