非聚集索引比聚集索引快?

9 index sql-server sql-server-2008-r2

两个表具有相同的结构,每个表中有 19972 行。为了练习索引,我创建了两个具有相同结构的表并创建了

clustered index on persontb(BusinessEntityID)
Run Code Online (Sandbox Code Playgroud)

nonclustered index on Persontb_NC(BusinessEntityId)
Run Code Online (Sandbox Code Playgroud)

和表结构

BusinessEntityID int
FirstName varchar(100)
LastName  varchar(100)                                                                                                                       

 -- Nonclusted key on businessentityid takes 38%
SELECT  BusinessEntityId from Persontb_NC
WHERE businessentityid BETWEEN 400 AND 4000

-- CLustered key businessentityid takes 62%
SELECT BusinessEntityId  from persontb 
WHERE businessentityid BETWEEN 400 AND 4000
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

为什么聚集索引占 62%,非聚集索引占 38%?

Mar*_*ith 10

是的,聚集索引每页的行数少于非聚集索引,因为聚集索引的叶页必须存储其他两列(FirstNameLastName)的值。

NCI 的叶页仅存储值BusinessEntityId和行定位符(如果表是堆,则为 RID,否则为 CI 键)。

因此,估计成本反映了更大的读取次数和 IO 要求。

如果您将 NCI 声明为

nonclustered index on Persontb_NC(BusinessEntityId) INCLUDE (FirstName, LastName)
Run Code Online (Sandbox Code Playgroud)

那么它将类似于聚集索引。


小智 5

聚集索引不仅包含来自索引所在列的数据,还包含来自所有其他列的数据。(每张表只能有一个聚集索引)

非聚集索引仅包含来自索引列的数据,以及指向其余数据所在位置的 row_id 指针。

因此,这个特定的非聚集索引更轻,扫描/查找所需的读取更少,并且这个特定的查询将更快地工作。

但是,您是否也尝试过检索 FirstName 和 LastName,结果会有所不同,聚集索引的性能应该会更好。