2

我想添加索引到我的表。 我正在尋找如何向表中添加更多索引的一般想法。 以外的其他PK集羣。 我想知道當我這樣做時要查找什麼。 所以,我的例子:表索引設計

這個表(我們稱之爲TASK表)將成爲整個應用程序的最大表。預計數百萬條記錄。

重要:大規模批量插入件在此表中添加數據

表具有27列:(到目前爲止,及數量:d)

INT×9列= ID-S

VARCHAR×10列

位×2列

日期時間×5列

INT COLUMNS

所有這些都是INT ID-S但從通常比任務表較小的表(10-50記錄最大),例如:狀態表(包含「打開」值, 「封閉」)或優表(包含「重要的」,「不那麼重要」,「正常」)值 也有像「父ID」(自列 - ID)

加入:所有「小」表有PK,通常的方式...聚簇

STRING COLUMNS

有一個(公司)列(字符串!),類似於「始終有5個字符長」,並且每個用戶都將受到限制。如果在任務中有15個不同的「公司」,登錄用戶只能看到一個。所以這總是有一個過濾器。向該專欄添加索引可能是一個好主意?

日期列

我認爲他們不索引這些,對吧?或者可以/應該是?

+0

要設計從*查詢*開始的索引。基本上,每個索引都設計爲*覆蓋*查詢或強制約束。 – 2010-12-22 15:55:37

+1

索引設計指南:http://msdn.microsoft.com/en-us/library/ms191195。在進一步做任何事之前先閱讀它們。 – 2010-12-22 15:57:55

回答

5

我不會添加任何索引 - 除非您有特定的理由這樣做,例如,性能問題。

爲了弄清楚什麼樣的指標來添加的,你需要知道:

  • 什麼樣的查詢被用來對付你的表 - 什麼是WHERE條款,什麼樣的ORDER BY是你在做?

  • 如何分配你的數據?其中列有足夠的選擇性(數據< 2%)成爲索引

  • 在桌子上是什麼樣的(負面)影響做額外的指數已經在你的INSERT和UPDATE

  • 的任何外鍵有用列應該是索引的一部分 - 最好是作爲索引的第一列 - 加快連結到其他表

而且確保可以索引DATETIME列 - 是什麼讓你認爲你不能?如果您有許多查詢會通過日期範圍來限制其結果集,那麼索引DATETIME列可能會非常有意義 - 可能不是它本身,而是與您的表的其他元素一起存在於複合索引中。

你不能索引哪些持有超過900個字節的數據列 - 類似的東西VARCHAR(1000)或此類。

對於偉大的深入和索引很懂行的背景下,諮詢blog by Kimberly Tripp,女王索引的。

3

一般的指數將加快JOIN,排序操作和過濾器

所以,如果列是在加入,ORDER BY或WHERE子句那麼指數將在性能方面的幫助。 ..但總是有,但...與每次添加UPDATE,DELETE和INSERT操作將減慢,因爲索引必須保持

所以答案是......這取決於

指數

我會說開始用查詢命中表並查看掃描的執行計劃,嘗試通過編寫SARGab如果需要的話,查詢或添加索引...不只是爲了添加索引而添加索引

+0

+1我喜歡通常的答案 - *取決於* :-) – 2010-12-22 15:53:21

1

第一步是瞭解如何在表中的數據將被使用:它是如何將被插入,選擇,更新,刪除。在不知道使用模式的情況下,你會在黑暗中拍攝。 (還要注意的是,無論你現在提出什麼,你可能都是錯的,一定要將你的決定與實際使用模式進行比較。)一些想法:

如果用戶經常會查找個人表中的項目,主鍵上的索引是至關重要的。

如果數據將高頻率地插入,你有多個索引,隨着時間的推移,你也必須處理索引碎片。閱讀並理解聚簇和非聚簇索引和碎片(ALTER INDEX ... REBUILD)。

但是,如果當您需要檢索大量行時性能是關鍵的情況下,你可能會考慮使用你的集羣indexe以支持。

如果您經常需要基於狀態的一組數據,那麼對該列進行索引編制可能會很好 - 特別是如果1%的行是「活動」與99%「未激活」,並且所有您想要的都是活躍的。相反,如果您的「PriorityId」僅用於獲取「label」,說明PriorityId 42是什麼(即加入查找表),那麼您的主表中可能不需要索引。 (a)你一定要爲此編制索引,並且(b)你可能想要考慮對該表進行分區值,因爲它可以作爲超越傳統索引的「內置過濾器」。 (這可能有點極端,它只在企業版中可用,但在您的情況下它可能是值得的。)