2012-10-10 137 views
3

我想弄清楚處理SQL Server中的表上的索引的最佳方法。SQL Server非聚簇索引

我有一張表,只需要從中讀取。沒有真正寫入表格(初始設置後)。

我有大約5-6列需要被索引的表。爲整個表設置一個非聚簇索引並將需要索引的所有列添加到該索引或我應該設置多個非聚簇索引(每個列都有一列)是否更有意義?

我想知道哪個設置會有更好的讀取性能。

對此的任何幫助將是偉大的。

UPDATE:

有一些好的答案已,但我想闡述一下我需要多一點。

有一個主表與自動記錄。我需要能夠對超過100MM記錄執行非常快速的計數。 Where語句會有所不同,但我試圖索引where語句中的所有可能的列。所以我有這樣的查詢:

SELECT COUNT(recordID) 
FROM tableName 
WHERE zip IN (32801, 32802, 32803, 32809) 
AND makeID = '32' 
AND modelID IN (22, 332, 402, 504, 620) 

或者是這樣的:

SELECT COUNT(recordID) 
FROM tableName 
WHERE stateID = '9' 
AND classCode IN (3,5,9) 
AND makeID NOT IN (55, 56, 60, 80, 99) 

因此,有大約5-6列,可能是在where子句中,但它會改變在哪些不少。

+2

您需要提供更多信息,因爲答案取決於您要運行的查詢類型以及數據的外觀,尤其是,基數。此外,您可能受益於計算列,索引視圖或全文索引。無法用您提供的最少信息來說。 – RedFilter

+1

仔細選擇[聚簇索引](http://stackoverflow.com/questions/11787797)對於讀取性能也非常重要。 –

回答

5

你擁有的指標少 - 越好。每個索引可能會加快一些查詢速度 - 但也會導致開銷並需要維護。如果你不寫很多東西,那還不錯。

如果你可以將多個列組合成一個索引 - 完美!但是,如果您在多個列上有複合索引,那麼如果您使用/需要最左邊的n列,那麼可以使用該索引,僅使用

所以,如果你有一個像在電話簿上(City, LastName, FirstName)指數 - 這個作品,如果你正在尋找:

  • 大家在一個給定的城市
  • 每一個「史密斯」,在「波士頓」
  • 每一個「保羅·史密斯」,在「紐約」

不能被用於查找名字「保羅」的所有條目或與姓氏所有的人「布朗」在你的桌子上;該指數可以使用,如果您還指定City

因此,因此 - 複合索引是有益的,可取的 - 但前提是你真的可以使用它們!有您的6列只是一個指數並不能幫助你所有,如果您需要選擇列單獨

更新:與具體的查詢,你現在可以開始設計什麼指標會有所幫助:

SELECT COUNT(recordID) 
FROM tableName 
WHERE zip IN (32801, 32802, 32803, 32809) 
AND modelID = '32' 
AND model ID IN (22, 332, 402, 504, 620) 

在這裏,一個索引(zip, modelID)可能會是一個好主意 - 無論zipmodelID在where子句(在一起)中使用,且該指數recordID以及(作爲Include(RecordID)條款)也應該有所幫助。

SELECT COUNT(recordID) 
FROM tableName 
WHERE stateID = '9' 
AND classCode IN (3,5,9) 
AND makeID NOT IN (55, 56, 60, 80, 99) 

再次:立足WHERE條款 - 創建(stateID, classCode, makeID)指數,並可能增加Include(RecordID)使非聚集索引成爲覆蓋(例如,所有需要爲您的查詢的信息是在非聚集索引本身 - 無需返回到「基本」表)。

+0

感謝您的幫助。這是有道理的,但我不確定最好的方法來做到這一點,因爲我正在處理WHERE子句中的6列。有太多的可能組合可以爲我創建索引。如果我只是將所有可能的列放在一個索引中,並將recordID作爲include,那會是一個問題。它可以減慢查詢速度嗎? – Sequenzia

+0

@Sequenzia:「只有所有列的索引」的想法將不會有益。如果你幸運的話,你可能會得到適合一種情況的組合 - 在這種情況下,它會被使用 - 但是索引只是在所有可能的列上**完全不是**好主意!不要這樣做!沒有比這樣的索引更好的索引! –

+1

感謝您的跟進。我明白你在說什麼。我做了更多的研究和一些測試。我看到那種方法不起作用。我將嘗試更多地確定我的查詢需求並圍繞它建立索引。我感謝您的幫助。 – Sequenzia

4

這取決於你的訪問模式

對於只讀表,我想最有可能創建多個非聚集索引,每個都具有多個鍵列匹配WHERE子句,並INCLUDEd列非鍵列

我既不會有一個非聚集所有,也不每列一個:他們不會useful.actual查詢

相關問題