天天看點

Design5:索引設計

在SQL Server中,一個表隻有兩種存儲結構:Heap和B-Tree,Heap是指沒有建立聚集索引的表,B-Tree 結構是指已經建立聚集索引的表。

索引是為了提高查詢性能而設計的存儲結構,索引是獨立于“資料”之外的資料結構,設計目标是為了查找資料,例如,對于聚集索引,葉子節點存儲的是資料,非葉子節點上存儲的是索引結構。

在更新資料時,SQL Server需要維護索引結構的更新,這可能會降低資料更新的性能,注意,是可能降低資料更新的性能,而不是一定會降低資料更新的性能。

要根據對表操作的類型來選擇表的存儲結構:

如果一個表純粹隻是為了存儲資料,而不進行查詢,那麼推薦不建立任何索引,使得該表不用維護任何索引結構,表的存儲結構就是Heap。

如果一個表不僅存儲資料,而且還會查詢資料,那麼推薦在表上建立聚集索引,把表結構轉換為B-Tree結構。舉個例子,通常,帶where條件的Update操作,首先需要查找到資料,然後再更新資料。 

注意,一個表隻能建立一個聚集索引,從SQL Server 2016開始,可以表上建立的聚集索引,要麼是rowstore的聚集索引,要麼是columnstore的聚集索引。

對于Disk-base的表上索引,從存儲格式上來看,可以分為rowstore和columnstore:

由于rowstore索引使用平衡樹結構來存儲資料,特别使用對單行資料或少量資料行的查找;由于rowstore索引是有序的,是以适合用于範圍查找。

columnstore索引有更高的壓縮效率,特别适合用于資料倉庫中的分析查詢,即通過少量的次元對事實表的一個或多個資料列進行聚合查詢。

對于記憶體優化表,可以在表上建立Hash索引,

哈希索引沒有順序,存儲在記憶體中,是單行資料查詢性能最高的索引類型。

由于聚集索引實際上就是表,葉子節點是表資料,非葉子節點是索引的結構。

非聚集索引實際上是建立在聚集索引的結構之上的,推薦先建立聚集索引,然後建立非聚集索引。

為了最大程度的從索引結構中獲得高的查詢性能,在建立索引時,應考慮填充,以減少頁拆分(Page Split)的數量;資料的更新會導緻索引碎片,需要重建或重組索引,以整理碎片,提高查詢性能。

推薦閱讀:《​​索引調優 第一篇:重建、填充和查找​​》,《​​索引調優 第二篇:碎片整理​​》

繼續閱讀