2011-07-18 31 views
4

我有這一個大的臨時表(〜1.6億行)#itemsTemp索引組通過對兩列

itemId | style | styleWeight 
-------------------------------- 
int  | smallint | float(53) 

和下面的查詢:

select 
    itemId, 
    style, 
    SUM(styleWeight) itemCount 
from 
    #itemsTemp 
group by itemId,style 

目前#itemsTemp沒有索引。我有點困惑,什麼是最好的位置:

  1. itemIdstyle(可能include styleWeight)複合指數
  2. itemId單獨的索引和style

哪種方式應我去?爲什麼?任何其他選項?

回答

4

itemIdstylestyleWeight包括在內的綜合指數將是最好的選擇。

這將使Stream Aggregate不排序和/或羣集尋求/ RID查找開銷。

+0

超級。建立索引(~10分鐘操作)後,查詢在大約一分鐘內完成。這很好。謝謝。 – spender

3

SQL Server 2008中實際上suggests missing indexes if you include the actual execution plandatabase tuning advisor tool也爲您建議索引。

然而的最佳指標取決於對這個表運行其他查詢:

  • 埃弗特指數添加到一個表都存儲處罰和性能損失寫的時候,所以,如果你寫爲了保持寫入性能可以接受,您希望保持索引數量合理低。
  • 如果許多其他的查詢使用相同的2列,那麼你可能需要使用一個綜合指數,只要這些查詢都可以採取指數的優勢(請記住,一個綜合指數事項的順序)。
  • 相反,如果其他查詢不能把它可以更好地使用兩個單獨的索引複合索引的優勢 - 性能可能是此查詢更低然而,這可能是值得的整體,如果指數再利用減少索引的數量在這張桌子上。

在現實中,指數建議功能往往工作得很好 - 我usully只是做它暗示了什麼(快思/全面的檢查後),然後只需運行一些簡單的測試,以確保查詢被實際執行與新的索引(ES)。

+0

當然,但是運行沒有索引的查詢需要**一點時間**(閱讀爲:一段相當長的時間!)。該表是臨時的(從之前的'select bla into#itemsTemp'),所以插入是在沒有索引的情況下執行的。它僅存在於我的問題中查詢的目的,隨後將被刪除,所以我不需要考慮任何其他使用情況。 – spender

1

除了兩種方式(手動)評估性能,可以使用查詢優化提示 - 例如:http://msdn.microsoft.com/en-us/library/ms181714.aspx

而且 - 如果你的臨時表是如此之大,不知有沒有解決的問題比使用臨時表一種更好的方式。

此外 - 你多長時間一次寫作還是閱讀?會議多久?你是否可以將其提供給其他程序?

+0

我試過使用CTE來解決這個問題,但數據量意味着我用盡內存很快,所以我不得不訴諸臨時表。由於這是一個只能在專用機器上每隔幾個月執行一次的過程,因此臨時表很好。 – spender