日期:2014-05-17  浏览次数:20490 次

为什么一定要添加INCLUDE,索引才会有用
本帖最后由 cyy201 于 2013-09-23 10:35:23 编辑
环境:WIN7 SP1,SQL2008 R2 SP2

CREATE TABLE [dbo].[test2](
[FID] [int] IDENTITY(1,1) NOT NULL,
[FDate] [datetime] NULL,
[FCol1] [int] NULL,
[FBillNo] [varchar](20) NULL,
 CONSTRAINT [PK_test2] PRIMARY KEY CLUSTERED ([FID] ASC)
)
GO


用while插入了2百万条的随机数据

在FDate上添加索引
CREATE NONCLUSTERED INDEX [IX_test2] ON [dbo].[test2]([FDate] ASC,[FID] ASC)

发现执行
SELECT * FROM test2 WHERE FDate >= '2013-08-01' AND FDate <= '2013-08-31'
并不走索引IX_test2,而是走聚合索引PK_test2

索引把所有SELECT到列都加上INCLUDE里面就可以:
CREATE NONCLUSTERED INDEX [IX_test4] ON [dbo].[test4]([FDate] ASC,[FID] ASC)
INCLUDE ([FCol1],[FBillNo])


为什么一定要在INCLUDE包含所有SELECT的列呢?以前SQL2000貌似不用这样

------解决方案--------------------
1、include是2005才出现的
2、由于索引定义有限制,16列、900bytes,所以当你需要加入索引的列很多很长时,会创建不了,这种情况下可以用include来避免这种情况。
3、其实你这个例子中,可以不用include,只需要把用到的列加入一个非聚集索引中即可,这种情况叫做“索引覆盖”或者覆盖索引。效果通常和include是一样的。