我希望你能分享你的时间来帮助我。
目前,我使用3个表来比较获取数据的性能。这3个表具有相同的列(LocInvID,ActivityDate,ItemID,StoreID,CustomerID),相同的数据(大约1300万条记录):
表LocInv1:在LocInvID上使用聚簇索引(它也是主键)。对于ActivityDate,使用分区表。 3列(ItemID,StoreID,CustomerID)是非聚集索引。
表LocInv2:在LocInvID上使用聚簇索引(它也是主键)。 未使用分区表。
表LocInv3:在LocInvID上使用聚簇索引(它也是主键)。 3列(ItemID,StoreID,CustomerID)是非聚集索引。 未使用分区表。
在[LocInv3]上创建非压缩索引[IX_LocInv3] ( [ItemID] ASC,[StoreID] ASC,[CustomerID] ASC )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个表中)
select ActivityDate,ItemID,StoreID,CustomerID from LocInv1 WITH (INDEX(IX_LocInv)) where ItemID=43
select ActivityDate,ItemID,StoreID,CustomerID from LocInv2 where ItemID=43
select ActivityDate,ItemID,StoreID,CustomerID from LocInv3 where ItemID=43
结果很奇怪:
表LocInv1变得最慢。可能吗?我的查询字符串不正确?
表LocInv3使用Non-Clustered Index,但在实际执行计划中,它是Clustered Index Scan。我不明白,我用ItemID查询,为什么它是Clustered Index Scan?
表LocInv2仅使用Clustered Index for LocInvID,但结果最快。这是正确的吗?
请告知。
感谢。
答案 0 :(得分:0)
查询优化器选择了他能找到的快速方式,不仅取决于索引,还取决于它们包含的数据。
通过聚簇索引进行搜索通常会更快,但在某些情况下,可以更快地执行此操作,您可以测试它是否会再次删除索引。
更不用说,取决于表所采用的操作(插入,更新,删除)和后期索引插入也会影响搜索。
这些更改将改变索引的存储方式,具体取决于您可能具有多个页面的索引的大小。
如果您可以在这些表中发布一个数据插入脚本,我可以看起来更好。 如果您只进行了查询分析器测试(ctrl + l),则不应该是100%精确度