当前位置:Gxlcms > 数据库问题 > SqlServer 聚集索引真的是最好了吗?

SqlServer 聚集索引真的是最好了吗?

时间:2021-07-01 10:21:17 帮助过:2人阅读

当前聚集索引键列为:([UserAcount],[UserName])

现考虑4种索引创建方法,到底哪种比较较好!~

--	DROP INDEX IX_TestTab ON [TestTab]
CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([UserAcount],[crdatetime])

CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([crdatetime])

CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([crdatetime],[UserAcount])

CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([crdatetime])INCLUDE([value],[Info])



--第一种:
CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([UserAcount],[crdatetime])
技术分享
这种还是使用聚集索引,并没有用到新的索引,因为新的索引第一个键列为 [UserAcount],与聚集索引一样,所以只要有[UserAcount] ,查询就使用聚集索引了!这个索引加上去也是白加。



--第二种:
CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([crdatetime])
技术分享
这个查询使用了索引查找,直接按列 [crdatetime]  查询,但是其他不包含在索引的列,使用了键查找。还得在索引子页中查找非索引列。并且锁少了很多!!


--第三种:
CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([crdatetime],[UserAcount])
技术分享
这种查询的执行计划与上面的一致,因为缓存计划进行了参数化,两者执行语句一样,使用的索引不影响执行计划。而且锁定的资源几乎一样。这个索引的另一列 [UserAcount] 其实是多余了,因为非聚集索引中都会包含聚集索引的键列。所以这个索引的第二列[UserAcount]可以去掉了。


--第四种:
CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([crdatetime])INCLUDE([value],[Info])
技术分享

这个锁定的资源就比较直接了!~完全使用非聚集索引查找,查询直接定位到数据行!~



所以对于聚集索引,应尽量使用唯一列作为聚集索引,或者最为键列的数据尽量不要重复,这样才能以最快速度定位到行。若没有唯一列,像上面的例子中,聚集索引和另一个比较有效的列作为组合索引聚集索引!~





SqlServer 聚集索引真的是最好了吗?

标签:

人气教程排行