我知道什么是表扫描、聚集索引扫描和索引搜索,但我的谷歌技能让我无法找到非聚集索引扫描的精确解释。为什么以及何时查询使用非聚集索引扫描?
谢谢你。
我知道什么是表扫描、聚集索引扫描和索引搜索,但我的谷歌技能让我无法找到非聚集索引扫描的精确解释。为什么以及何时查询使用非聚集索引扫描?
谢谢你。
顾名思义,非聚集索引扫描是对非聚集索引的扫描 - 如果选择中的所有字段都可以从非聚集索引中完成,那么通常会进行 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;