非聚集索引也是堆結構?其實sqlserver有幾種頁面型別(資料都使用一頁一頁來儲存,就像windows的記憶體也是使用頁面來組織的)感興趣的朋友可以了解下,希望本文可以增加你們對非聚集索引結構的理解。
我們知道sqlserver的資料行的儲存有兩種資料結構:a:堆b :b樹(binary 二叉樹)。資料按照這種兩種的其中一種來排序和儲存,學過資料結構的朋友應該知道二叉樹,為什麼用二叉樹,因為方便用二分查詢法來快速找到資料。堆的資料是不按照任何順序排序的,也沒有任何結構,資料頁面也不是首尾相連的。不像b樹,資料頁面使用雙向鍊錶首尾相連。堆表只依靠表裡的iam頁(索引分配對映頁)將堆的頁面聯絡在一起,iam裡記錄了頁面編號,頁面位置除非表裡有聚集索引,如果沒有的話那麼表裡的資料的儲存就是堆結構。
那麼非聚集索引呢?非聚集索引也是堆結構?其實sqlserver有幾種頁面型別(資料都使用一頁一頁來儲存,就像windows的記憶體也是使用頁面來組織的)
其中有一種是索引頁,一種是資料頁。
我感覺很多書都說不清,就像我一樣,在文章的開頭也是這樣說的:資料行的儲存有兩種資料結構:a:堆b :b樹(二叉樹)
我覺得應該是資料頁面的儲存有兩種資料結構:1、堆2、b樹
先說一下:索引頁,不管是聚集索引還是非聚集索引,這些索引資料都存放在索引頁,而索引頁都是按照b樹的結構裡儲存的。
而堆頁:也就是實際的資料行,如果表裡沒有聚集索引,那麼實際的資料就放在堆頁,如果聚集索引,那麼資料就放在索引頁。
而b樹里的節點,其實又叫頁面,又叫節點在b樹里會有一頁:root page(亦即是根節點),非聚集索引和聚集索引都是一樣的。
而在堆裡的資料頁面完全是隨機存放的,而資料頁面之間唯一的邏輯連線是記錄在iam頁裡的,所以iam頁也就扮演了root page的角色。(也就是只有乙個根節點的樹,直接對映到對應位置)
那麼聚集索引呢?聚集索引也是堆結構?
非聚集索引放在索引頁,b樹結構,資料依舊放在堆頁,那麼如果資料頁放在堆裡,不像聚集索引放在b樹的葉子節點裡
(亦即是放在索引頁裡),那麼非聚集索引和實際的資料如何發生聯絡呢?
答案是:在非聚集索引的葉子節點(葉子頁面)會有行定位器。而行定位器的作用請看下面紅色字
非聚集索引與聚集索引具有相同的b樹結構,他們之間的顯著差別在於以下兩點:
(1)基礎表的資料行不按非聚集鍵的順序排序和儲存
(2)非聚集索引的葉層是由索引頁而不是由資料頁組成
(3)建立非聚集索引的表可以是乙個b樹,也可以是乙個堆
(4)如果表是堆(意味著表沒有聚集索引),行定位器指向行的指標。該指標是由(檔案識別符號
id:頁碼:頁上的行數)組成。整個指標稱為行id(
rid)(5
)如果表有聚集索引或索引檢視上有聚集索引,則行定位器會指向聚集索引鍵。
sql通過使用儲存在非聚集索引的葉子內的指標(指向聚集索引鍵)搜尋聚集索引來檢索實際資料。
非聚集索引不會改變或改善實際資料頁的儲存模式。他的b樹結構只針對自己的索引頁面。不過,非聚集索引跟聚集索引的作用還是一樣的,相當於檢字表
最後總結一下吧,這麼短的隨筆總結啥子呢?
當然是總結表的結構,因為曾經有人在論壇裡問過一張表的結構
a 有聚集索引的表或者有聚集索引也有非聚集索引(b樹)
b 沒有任何索引(堆)
c 沒有聚集索引,有非聚集索引(b樹+堆)
論壇裡有人簡稱a為聚集表,b和c為堆表
堆表的結構
非聚集索引的結構
聚集索引的結構
聚集索引與非聚集索引
一 聚集索引概念 漢語字典的正文本身就是乙個聚集索引。比如,我們要查 安 字,就會很自然地翻開字典的前幾頁,因為 安 的拼音是 an 而按照拼音排序漢字的字典是以英文本母 a 開頭並以 z 結尾的,那麼 安 字就自然地排在字典的前部。如果您翻完了所有以 a 開頭的部分仍然找不到這個字,那麼就說明您的...
聚集索引與非聚集索引
1 聚集索引 聚集索引的意思可以理解為順序排列,比如乙個主鍵自增的錶即為聚集索引,即id為1的存在於第一條,id為2的存在於第二條.假使資料庫中是使用陣列來存放的這張表中的資料,那麼如果我需要查詢第100條,那麼直接第一條資料的位址加上100即為第一百條的位址,一次就能查詢出來。因為資料庫中的資料只...
聚集索引與非聚集索引
1 3點 聚集索引和非聚集索引簡單了解 4 5點是細節點 聚集索引 定義 資料行的物理順序和列值 一般是主鍵的那一列 的邏輯順序相同 理解 乙個表就像是我們以前用的新華字典,聚集索引就像是拼音目錄。我們如果要查詢乙個 哇 字,我們只需要查詢 哇 字對應在新華字典拼音目錄對應的頁碼,就可以查詢到對應的...