"INCLUDE"在索引中做了什么?

Dan*_*ite 2 sql t-sql sql-server

INCLUDE在非聚集索引中有什么作用?

CREATE NONCLUSTERED INDEX [MyIndex] ON [dbo].[Individual] 
(
    [IndivID] ASC
)
INCLUDE ( [LastName], [FirstName]) 
WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我知道第一部分用于该WHERE子句,但INCLUDE列有什么作用?将它们"添加到非聚集索引的叶级别"有什么好处?

编辑此外,如果我已经有一个聚集PK索引IndivID,为什么Tuning Advisor推荐这个索引?

Sam*_*aan 9

INCLUDE列包括与索引相关联的字段.它们不用于索引,但它们放在构成索引的B树的叶节点中.

实质上:索引仍然只有ON [IndivID]和[IndivID].但是,如果您的查询只需要[IndivID],[LastName]和[FirstName]的子集,则SQL在找到它在索引中搜索的[IndivID]后不需要返回该表.

见:覆盖指数

编辑:B树假定MS SQL Server.我不肯定其他实现使用相同的数据结构

Tuning Advisor(推测)::聚簇索引将整个数据行放在索引的B树的叶节点上,这占用了大量空间.如果Tuning Advisor发现您永远不会访问超过这三个字段([IndivID] + INCLUDE),它将尝试通过将其降级为非聚集索引来节省空间(并插入/更新时间)存在"重要"领域.


JNK*_*JNK 5

INCLUDE在索引的叶级添加这些字段.基本上bt-ree没有按这些字段排序,但是一旦索引找到了它正在寻找的索引字段的行,它也会立即拥有其他字段.

如果您使用的电话簿比喻,INCLUDED在电话簿索引字段(这是排序Lastname,Firstname)是Phone NumberAddress-你不能用这些字段查找一个人,但一旦你有他们的名字,你可以找到他们.

CLUSTERED索引已按设计包含所有字段,因此INCLUDE在a中无效CLUSTER.您也不应该打扰INCLUDE非聚集索引中的聚簇字段,因为它已经隐含在那里作为行键.

我经常使用INCLUDE字段进行聚合.例如,如果我有一个索引CalendarDate,CustomerID我可以包含PaidAmt和获取

MAX(PAidAmt) Where CustomerId = x AND CalendarDate = 1/1/2011

在最基本的级别,它们用于避免书签或键查找.