2011-08-04 37 views
0

我有一個表Person的列personId, teamId, departmentId,等等。大多數查詢在where處使用這些列的組合。SQL服務器:對同一列的多個索引性能

Select * from .. where personId = 2 and departementId = 1 
Select * from .. where personId = 2 and teamId = 1 
Select * from .. where departmentId = 2 and teamId = 1 

我的問題是,我應該爲每個單獨一個欄的指數?

+0

實際查詢不是選擇*。我只是把這個作爲一個例子 – roncansan

回答

2

快速答案是肯定的 - 只需要加一個索引爲每列。它不可能是最優化的解決方案,但在大多數情況下,它不會那麼遙遠,除非在該表上已經有很多索引,否則它可能不會造成任何傷害。

唯一稍長的答案是,你應該測試你對代表數據查詢 - 該SQL Server Database Engine Tuning Advisor可以建議索引你,但只有你可以檢查,以確保這些指標適用於其他所有查詢(包括插入/更新) - 您需要在寫入數據庫時​​(以及任何存儲/空間限制)平衡讀取性能與維護這些索引的成本。

1

不考慮所有的查詢工作負載,最好的答案是很難給出。

如果你實際上是在選擇這些查詢所有列(*),然後創建覆蓋索引是不是真的實用,這樣一個答案是肯定的,創建這些列單列索引。

你也可以創建索引:

1)personIddepartmentId

2)personIdteamId

3)departmentIdteamId

創造了很多指標,而不是好處很少有很大程度上取決於讀寫比。另外,你的聚集索引是什麼定義的?

如果你的查詢不是SELECT *(如你在評論你的問題提),那麼如果所選列名單不會太長,你也許可以建立有效覆蓋索引。

優化顧問已經提到的數據庫;它做得相當不錯,但有些事情需要在其建議中考慮。

+0

聚集索引是在person.id上定義的。 – roncansan

2

無論是每列一個:SQL Server將使用索引交集

或者,嘗試這樣的事:三個複合索引。每一列的第一列也可以用作「單列索引」。

  • departmentId, teamId, personId
  • personId, departmentId, teamId
  • teamId, personId, departmentId

注:

  • WHERE子句順序並不重要
  • SELECT *不好

此外,它有外鍵列索引,任何一個策略將工作

0

我不會,作爲一項規則,創建現場使用的變化3項指標是一個好主意,但是,這只是一個一般的規則。

至於「我如何做這個新手」的答案,我會創建一個工作負載並使用調優顧問。這不是一個終極解決方案,而且隨着有人學到更多,他們超越了巫師,但它是一個開始的好地方。確保你有一個體面的代表性樣本,因爲如果索引不正確,索引可能會破壞其他查詢的性能。

+2

「索引可能會破壞其他查詢的性能」 - 這是一段清晰的陳述。是的,它可以影響INSERTS,但即使插入也需要找到插入點.... –

+0

@Mitch小麥:+1每個DML都是一個讀取,無論是查找行,檢查唯一性,檢查FK。我並不認同「太多索引」理論 – gbn

+0

@gbn - 儘管如此,當你有很多重疊時,你可能會遇到問題。如果您更新3個不同索引中的字段,則會開始乘以負面影響。 – JNK