我在db中使用Clustered和non-clustered Index很困惑

时间:2012-08-07 10:01:04

标签: sql-server indexing

我希望你能分享你的时间来帮助我。

目前,我使用3个表来比较获取数据的性能。这3个表具有相同的列(LocInvID,ActivityDate,ItemID,StoreID,CustomerID),相同的数据(大约1300万条记录):

  1. 表LocInv1:在LocInvID上使用聚簇索引(它也是主键)。对于ActivityDate,使用分区表。 3列(ItemID,StoreID,CustomerID)是非聚集索引。

  2. 表LocInv2:在LocInvID上使用聚簇索引(它也是主键)。 未使用分区表

  3. 表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

  4. 当我运行此查询字符串(在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
    

    结果很奇怪:

    1. 表LocInv1变得最慢。可能吗?我的查询字符串不正确?

    2. 表LocInv3使用Non-Clustered Index,但在实际执行计划中,它是Clustered Index Scan。我不明白,我用ItemID查询,为什么它是Clustered Index Scan?

    3. 表LocInv2仅使用Clustered Index for LocInvID,但结果最快。这是正确的吗?

    4. 请告知。

      感谢。

1 个答案:

答案 0 :(得分:0)

查询优化器选择了他能找到的快速方式,不仅取决于索引,还取决于它们包含的数据。

通过聚簇索引进行搜索通常会更快,但在某些情况下,可以更快地执行此操作,您可以测试它是否会再次删除索引。

更不用说,取决于表所采用的操作(插入,更新,删除)和后期索引插入也会影响搜索。

这些更改将改变索引的存储方式,具体取决于您可能具有多个页面的索引的大小。

如果您可以在这些表中发布一个数据插入脚本,我可以看起来更好。 如果您只进行了查询分析器测试(ctrl + l),则不应该是100%精确度