2012-11-30 25 views
1

我有列SQL Server 2008中索引多列一些不使用所有的時間

ParameterValueId, SiteId, LocationId, ParameterId, SampleDateTime 

和其他一些列的表。

ParameterValueId是主鍵。

我想創建一個非唯一的索引以加快SiteId, LocationId, ParameterId, SampleDateTime上的查詢。

  • 我所有的查詢會用我的查詢SiteId
  • 75%將使用SiteIdLocationId
  • 我的查詢
  • 50%將使用SiteIdLocationId,和我的查詢ParameterId
  • 25%將使用SiteIdLocationIdParamterId和過濾>=/<= SampleDateTime

我可以在SiteId, LocationId, ParameterId, SampleDateTime上創建一個索引嗎?

或者我是否需要創建4個索引?

我想我的問題是,如果我創建一個索引4列將使用它,並仍然提高性能,如果我只使用1,2或3列,而不是全部4?

+0

「如果我創建一個索引,那麼如果我只使用1,2或3個4不是全部4個,那麼它將被使用並仍然會提高性能?」 - 是的。 (並且確保你的覆蓋索引也適合你的場景(SiteId,LocationId,ParameterId,SampleDateTime)。不要以爲每個列創建一個索引,這在你的情況下根本不是一個好習慣 – Tirumudi

回答

6

作爲一般的經驗法則,考慮到您所描述的情況,所有四列中的一個索引可能是一個很好的起點。但是,根據數據的性質和形狀,您可能還需要做其他事情來提高性能(例如,SiteID的差異程度如何?它是否是唯一的?單值是否超過了數值的20%那個柱子?)。

簡答:將使用一個覆蓋索引,即使並非查詢中使用了所有被覆蓋的列。

+0

我同意我只能添加:TAKE MEASUREMENTS在應用任何索引之前,使用'SET STATISTICS TIME'來捕獲查詢真正需要的時間,並捕獲查詢計劃並保存它,然後得到一個基線。現在你知道你已經取得了多大的進步,並且在績效下降的六個月時間裏,你有一些東西可以衡量它。 –

+0

SitedId是指客戶公司的位置(這可能是1英里radus)。SiteId將隨着更多客戶的增加而增長,所以假設我們有5個站點,分派率應該是20%,LocationId是一個特定的經度,lon在SiteId指定的範圍內。使用已知分數的查詢。主要的問題是,當我創建一個帶有四個colmns的索引時,1,2,3列的查詢仍然使用該索引仍然使用? –

+0

我還建議,如果你大多數時候以這種方式查詢表格,那麼你應該把它作爲你的聚集索引。如果它不是聚簇索引,並且您正在從表中選擇其他列(我想大於一個計數(*)),那麼您可能希望在索引中使用INCLUDE子句以使其他列避免書籤查找 –

相關問題