4

我知道什么是表扫描、聚集索引扫描和索引搜索,但我的谷歌技能让我无法找到非聚集索引扫描的精确解释。为什么以及何时查询使用非聚集索引扫描?

谢谢你。

4

1 回答 1

14

顾名思义,非聚集索引扫描是对非聚集索引的扫描 - 如果选择中的所有字段都可以从非聚集索引中完成,那么通常会进行 NCI 扫描,但查询的选择性或索引也是如此差导致Seek。

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;
于 2014-10-22T14:38:26.177 回答