什么是非聚集索引扫描

时间:2014-10-22 14:34:19

标签: sql-server sql-server-2008 sql-server-2008-r2 indexing non-clustered-index

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

谢谢。

1 个答案:

答案 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;