2012-08-07 74 views
2

我希望你能分享你的时间来帮助我。我很困惑在我的分区中使用集群和非集群索引

目前,我使用3个表来比较获取数据的性能。这3代表具有相同的列(LocInvID,ActivityDate,项ID,STOREID,客户ID),相同的数据(约13万条记录):使用聚簇索引LocInvID(它的主太键):

  1. 表LocInv1。 对于ActivityDate使用分区表。并且3列(ItemID,StoreID,CustomerID)是非聚集索引。

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

  3. Table LocInv3:在LocInvID上使用聚簇索引(它也是主键)。并且3列(ItemID,StoreID,CustomerID)是非聚集索引。 不使用分区表

    CREATE NONCLUSTERED INDEX [IX_LocInv3] ON [LocInv3] ( [项ID] ASC,[STOREID] ASC,[客户] 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 

结果很怪异:

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

  2. Table LocInv3使用非聚集索引,但在实际执行计划中,它是聚簇索引扫描。我不明白,我用ItemID查询,为什么它是聚簇索引扫描?

  3. 表LocInv2只使用ClIntered Index作为LocInvID,但它得到了最快的结果。这是对的吗?

请指教。

谢谢。

+2

*我用ItemID查询,它为什么是聚簇索引扫描?*这是因为查询优化器做出决定,扫描整个聚集索引比索引查找和查找更快/更便宜。尝试在包含'ActivityDate,StoreID,CustomerID'列的'ItemID'上创建一个非聚集索引 - 在这种情况下,这将覆盖非聚集索引很可能会被使用 – 2012-08-07 10:25:41

+0

是的,谢谢marc_s,我会尝试。 – 2012-08-08 04:18:05

回答

0

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

聚簇索引的搜索速度通常更快,但在某些情况下,更快地执行此操作,可以对其进行测试,然后再次删除并重新放置索引。

更不用说,根据表提供的操作(插入,更新,删除)和后期索引插入也会影响搜索。

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

如果你可以发布一个插入脚本的数据在这些表里面,我可以看起来更好。 如果你只做了查询分析器测试(ctrl + l)它不应该100%精确