在B-樹中查找給定關鍵字的方法是,首先把根結點取來,在根結點所包含的關鍵字K1,…,Kn查找給定的關鍵字(可用順序查找或二分查找法),若找到等於給定值的關鍵字,則查找成功;不然,必定能夠肯定要查找的關鍵字在Ki與Ki+1之間,Pi爲指向子樹根節點的指針,此時取指針Pi所指的結點繼續查找,直至找到,或指針Pi爲空時查找失敗。sql
動態查找樹主要有:二叉查找樹(Binary Search Tree),平衡二叉查找樹(Balanced Binary Search Tree),紅黑樹(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找樹結構,其查找的時間複雜度數組
O(log2N)數據結構
與樹的深度相關,那麼下降樹的深度天然會提升查找效率。sqlserver
咱們都知道sqlserver數據行的存儲結構有兩種:堆(heap)和B樹(binary二叉樹)。學過數據結構的人都知道,二叉樹的優勢是:快速使用二分法找到數據,數據頁面使用雙向鏈表首尾相連。再介紹一下數據結構中的堆(heap)。堆中的數據沒有任何順序,數據頁面也不會首尾相連。那怎麼在堆中查找數據呢? 堆的結構及IAM結構以下:.net
堆表只依靠表裏的IAM頁(索引分配映射頁)將堆的頁面聯繫在一塊兒,IAM中記錄了頁面編號和頁面位置。由此能夠經過IAM掃描數據。
1.不少書中都講到sqlserver數據行的存儲結構有兩種:堆(heap)和B樹(binary二叉樹)。而我以爲sqlserver數據頁的存儲結構有兩種:堆(heap)和B樹(binary二叉樹)。
2.數據都存在頁面中,sqlserver頁面有兩種類型:數據頁和索引頁。索引頁都是按照B樹結構存儲的。
那麼重點來了:
無論是彙集索引,仍是非彙集索引,索引數據都存放在索引頁中。
表中若是有聚合索引,那麼數據所有存儲在索引頁中。
表中若是隻有有非聚合索引,那麼數據存在堆頁(也就是實際的數據行),可是索引數據存儲在索引頁中。
表中若是既有彙集索引,也有非彙集索引,那麼數據和索引都存放在索引頁中。
B樹結構中,每個節點就是一個頁面,B樹裏會有一頁:root page(亦便是根節點),非彙集索引和彙集索引都是同樣的。
下面開始步入正軌介紹索引:
指針
有人會問爲何一張表只能有一個彙集索引,簡單來講由於表只能以一種順序排列在磁盤中,因此表只能有一個彙集索引。而非彙集索引能有好幾個。
彙集索引由於數據所有存放在索引頁中,因此順着彙集索引就能夠查到數據。彙集索引結構以下:server
1.若是非彙集索引的數據放在堆表中(表示沒有彙集索引),而非彙集索引的數據放在索引頁中。那麼非彙集索引怎麼查找數據呢?在非彙集索引的葉子節點(即葉子頁面)有行定位器,行定位器指向行的位置。由文件標示符、頁碼、行上的行數組成。整個指針稱爲行ID(RID)。
2.若是非彙集索引的數據放在索引表中(表示有彙集索引),那怎麼查找數據呢?則行定位器會指向彙集索引鍵。SQL使用非彙集索引葉子節點的指針指向的彙集索引鍵值,來查找數據。blog