sql server 索引闡述系列四 表的B-Tree組織


一.概述  

  說到B-tree組織,就是指索引,它可以提供了對數據的快速訪問。索引使數據以一種特定的方式組織起來,使查詢操作具有最佳性能。當數據表量變得越來越大,索引就變得十分明顯,可以利用索引查找快速滿足條件的數據行。某些情況還可以利用索引幫助對數據進行排序,組合,分組,篩選。

   一個B-tree,根是唯一的遍歷的起點。中間頁 層次數是根據表的行數以及索引行的大小而變化。索引中的底層節點稱為葉節點。葉節點它容納了一行或多行具有指定鍵值的記錄,對於聚集或非聚集,葉節點都是按照鍵值的順序組成,對於復合索引就是若干鍵值的組合。

  1.聚集索引

  在聚集索引的葉節點里不僅包含了索引鍵,還包含了數據頁。也就是說數據本身也是聚集索引的一部分。聚集索引基於鍵值聯系使表中的數據有序。決定哪個鍵值作為聚集鍵是重要因素,當遍歷到葉級別時,可以獲取數據本身,而不是簡單地得到一個指向數據的指針(非聚集索引數據未覆蓋)。聚集索引在 sys.partitions區中有一行,其中,索引使用每個分區的 index_id = 1,默認情況下,聚集索引是單個分區。如果聚集索引有四個分區,就有四個 B-tree 結構,每個分區中有一個 B-tree結構,關於分區在sql server 分區(上)中有講到。由於數據頁鏈只能按一種方式排序,因此表只有一個聚集索引,一般情況查詢優化器非常傾向於采用聚集索引,因為可以直接在葉級別找到數據。  查詢優化器也只需要在某一段范圍的數據頁,進行掃描。聚集索引結構按物理順序存儲不是磁盤上的順序,聚集索引的排序順序僅是表數據鏈在邏輯上有序的。

  2.非聚集索引

  非聚集索引與聚集索引有一個相似的 B -tree索引結構。不同的是,非聚集索引不影響數據行的順序。什么意思呢,就是說非聚集索引,葉級別不包含全部的數據,只包含了鍵值以及,在每個葉節點中的索引行包含了一個書簽(bookmark),書簽在聚集索引里就是相應的數據行的聚集索引鍵,在堆里就是行標識符RID,該書簽告訴sql server可以在哪里找到與索引鍵相應的數據行。
理解了非聚集索引葉節點不包含全部數據時,就知道非聚集索引的存在並不影響數據分頁的組織,因此每張表上最多249個非聚集索引。
非聚集索引在 sys.partitions 區中有一行, 非聚集索引標識 index_id >1。默認情況下,一個非聚集索引一個分區。

二. 缺少索引與索引查找的區別

   在簡單介紹了索引原理后,我們來直觀感覺下索引在查詢時的重要性。下面演示一個product表,表中的數據有12236142條,如果用戶根據表中的型號(model)來搜索。下面來看看缺少索引(沒有使用到索引),以及索引查找(就是應用到了索引功能)。二者的區別

  2.1 缺少索引的演示

--查詢型號model 值STI5203 在全表中有三條
SELECT Model FROM dbo.Product WHERE Model='STI5203'

圖下告訴我們缺少索引,如果加了索引將提高性能99.94%, 該查詢掃描計數5 (掃描了5個區),邏輯讀取次數為69951次(一次一頁),耗時954毫秒。
執行計划告訴我們是索引掃描也叫缺少索引,索引名是ixUpByMemberID,注意索引掃描不是索引查找,索引掃描是說把索引組織上的頁全部掃描了一遍。

  再通過下圖我們清楚知道,ixUpByMemberID有5個區。5個區加起來的data_pages總頁數是69730。上圖邏輯讀取是69951。相當於把索引中的頁全部掃描了一遍。也可說是把12236142條數據全掃描了一次。

  在鎖的介紹中我們知道,鎖越多,發生阻塞和死鎖的幾率就越大。
  通過下圖,對於page資源來說,就有IS鎖(意向共享鎖)上1000個。IS鎖與X排它鎖又不兼容,此時多用戶在修改,刪除表中數據時,將會發生阻塞或死鎖的影響。

    總結:如果在生產環境,面對大數據表,條件查詢很頻繁,又缺失索引,系統整體性能將會被拖垮。

   2.2 查詢索引查找的演示

  用戶根據model查詢,缺少了一個索引,在給model建立索引后,再來看

--查詢型號model 值STI5203 在全表中有三條
SELECT Model FROM dbo.Product WHERE Model='STI5203'

  下圖的執行計划告訴我們是索引查找,也就是索引使用上了,該索引名叫ix_mdoel. 掃描計數1 個區,邏輯讀取次數為4次,耗時0毫秒.

  再來看下索引查找的鎖狀態,下圖告訴我們,只有鎖往了一個page資源。

  總結:在大表上,合理使用了索引查找后,不但查詢響應時間變快了,而且沒有了大量的鎖,相應的在其它page頁上的修改,刪除應不會受到影響。

三. B-tree組織存儲空間的影響

  我們知道了對於聚集索引,它的葉子層就是數據本身,但當一個表有多個非聚集索引時,就需要對數據庫存儲空間加倍來支持這些索引的存儲,所以從占用存儲空間來說,在建非聚集索引時需要好好規划。下面是來自生產環境的一個表,有聚集索引和四個非聚集索引,來看看索引存儲空間
在index_id=1的聚集索引中占用的空間total_pages是1448806頁,也就是表的數據本身。 而非聚集索引占用空間total_pages是2180034頁, 非聚集索引占用空間比表數據本身大了1.5倍。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM