先来看两个例子:
1.创建测试表,C1为主键。
CREATE TABLE [dbo].[ProdTable2](
[c1] [int] IDENTITY(1,1)NOTNULL,
[c2] [datetime] NULL,
[c3] [char](25)NULL,
CONSTRAINT[PK_ProdTable2] PRIMARY KEY CLUSTERED
(
[c1] ASC
)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON [PRIMARY]
) ON [PRIMARY]
2.创建非聚集索引:
CREATE NONCLUSTERED INDEX(
[c2] ASC
)
INCLUDE( [c3])WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,SORT_IN_TEMPDB=OFF,IGNORE_DUP_KEY=OFF,DROP_EXISTING=OFF,ONLINE=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON [PRIMARY]
GO
3.查询C1表的所有字段,限制条件为C2:
select * from dbo.ProdTable2
where c2 ='2012-08-0111:03:09.687'
执行计划:
可以看到查询使用了索引Ix_C2一次性返回所有数据(C1,C2,C3),说明在有Cluster索引表中,非聚集索引页业级别存储了Cluster index key,value,NONCLUSTERED INDEX值以及Include字段值。
4.删除主键再运行相同的查询得到下面的执行计划:
可以看到使用了索引Ix_C2以及RID Lookup共同返回数据,说明非聚集索引页级别在HEAP表中存储的是RID(FileID:PageID:SlotNumber)NONCLUSTERED INDEX值以及Include 字段值。