2009-08-29 78 views
1

我已經創建了腳本來爲每個表找到每列的選擇性。在一些小於100行的列表中,列的選擇性大於50%。 其中選擇性=不同值/總數行創建索引的資格

那麼,那些列是否有資格索引? 或者,您能否告訴我們,創建索引的資格需要多少最少的行數?

回答

4

我想我通過計算數據的「選擇性」值來理解你所要達到的目標,但是你不能盲目應用規則。

事實上,在某些查詢中,「選擇性」值可能非常低,但索引仍然非常有用。例如:
假設一個包含數百萬行的「收件箱」表,這些行具有''讀取'布爾字段。在這種情況下,行數的不同值將非常低。如果大多數項目都是大部分時間閱讀,那麼找到帶有索引的未讀項目將非常有效。

創建索引索引需要付出代價。雖然您可以獲得讀取的好處,但您需要爲寫入和磁盤使用付費。

我寧願推薦你相應地分析你的查詢和索引。您還可以查看sys.dm_db_missing_index_group_stats中的數據以及其他動態管理視圖,這些視圖可讓您深入瞭解索引使用情況(或缺失情況)。

2

您可以在具有0行,1行或1億行的表上創建索引。您可以創建一個索引,其中每列具有相同的值或唯一值。

所以你可以創建一個索引。問題是應該你創建一個索引,沒有工具會告訴你,因爲索引也可以是多值的,它取決於你運行的查詢。創建索引是在性能調優查詢時完成的,或者當您知道您將創建使用它的查詢時進行搶佔。

每個索引都需要進行更新,插入和刪除所需的空間和時間。你不希望虛假地創建它們,所以你將不得不手動完成它,而不是腳本的結果,以查看列的價值有多獨特。

+0

你開始這篇文章的方式,我真的認爲你要去我們的綠色雞蛋和火腿。可悲的是,我錯了。但是,建議 - 確保在創建索引之前使用RDBMS的性能調整功能! – Eric 2009-08-29 15:29:56

+0

謝謝大家的回答。 – Paresh 2009-12-01 09:23:29

0

一般的經驗法則說,如果你有一個非常大的表(超過100萬行),你應該只使用索引,如果基於該索引的WHERE子句最多選擇1-2數據的百分比。如果你有一個「性別」列,大約50%的值是「男性」和大約50%的「女性」,那麼擁有一個索引並不會給你太多--SQL Server和大多數其他RDBMS在這種情況下,很可能仍然會進行全表掃描,因爲平均而言,他們必須至少掃描一半的表格,因此首先使用索引然後查找實際完整數據的「繞行」該指數值是不值得的。

如果您擁有唯一鍵(客戶號碼)或相當有選擇性的值,索引非常好。索引不是沒有代價的 - 它佔用磁盤空間,需要維護,它會稍微減慢除SELECT之外的所有操作 - 所以仔細的線程,它是而不是最好的辦法就是盲目索引所有內容。指數太少是不好的 - 但是太多和錯誤的指數可能會更糟! :-)沒有人聲稱讓你的索引是正確的.... :-)

但是肯定有幫助 - 我知道的最好的來源是金佰利特里普的優秀blog posts on SQL Server indexing(和許多其他主題)。

馬克