我知道什么是表扫描,聚簇索引扫描和索引搜索,但我的谷歌技能让我失望,找到非聚集索引扫描的精确解释。为什么以及何时查询使用非聚集索引扫描?
谢谢。
答案 0 :(得分:10)
顾名思义,Non Clustered Index Scans是非聚簇索引上的扫描 - 如果select中的所有字段都可以从非聚簇索引中完成,那么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;