的項目中,竟然出現了濫用聚集索引的問題。看來沒有培訓最最基礎的索引的意義,代價,使用場景,是一個非常大的失誤。這篇部落格就是從這個角度來羅列索引的基礎知識。
使用索引的意義
索引在資料庫中的作用類似於目錄在書籍中的作用,用來提高查找信息的速度。
使用索引查找數據,無需對整表進行掃描,可以快速找到所需數據。
使用索引的代價
索引需要占用數據表以外的物理存儲空間。
創建索引和維護索引要花費一定的時間。
當對表進行更新操作時,索引需要被重建,這樣降低了數據的維護速度。
創建索引的列
主鍵
外鍵或在表聯接操作中經常用到的列
在經常查詢的欄位上最好建立索引
不創建索引的列
很少在查詢中被引用
包含較少的惟一值
定義為 text、ntext 或者 image 數據類型的列
heaps是staging data的很好選擇,當它沒有任何index時
excellent for high performance data loading (parallel bulk load and parallel index creation after load)
excellent as a partition to a partitioned view or a partitioned table
聚集索引提高性能的方法,在前面幾篇部落格中分別提到過,下面只是一個簡單的大綱,細節請參看前面幾篇部落格。
何時創建聚集索引?
clustered index會提高大多數table的性能,尤其是當它滿足以下條件時:
獨特, 狹窄, 靜止: 最重要的條件
持續增長的,最好是只向上增加。例如:
identity
date, identity
guid (only when using newsequentialid() function)
聚集索引唯一性(獨特型的問題)
由於聚集索引的b+樹結構的葉子節點必須指向具體數據。如果你要建立聚集索引的列不唯一,並且你指定的創建的聚集索引是非唯一的聚集索引,則會有以下情況:
如果未使用 unique 屬性創建聚集索引,資料庫引擎 將向表自動添加一個四位元組 uniqueifier 列。必要時,資料庫引擎 將向行自動添加一個 uniqueifier 值,使每個鍵唯一。此列和列值供內部使用,用戶不能查看或訪問。