首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

为啥一定要添加INCLUDE,索引才会有用

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

为什么一定要添加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是一样的。

热点排行