2012-08-07 72 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%精確