儲存引擎揭秘:基本結構之二——頁
繼續儲存引擎揭秘系列,今天討論頁結構。頁是用來儲存記錄的。乙個頁是資料庫檔案中的乙個
8192
位元組段。頁在資料檔案中開始於
0位元組,並按
8192
位元組對齊。下面是乙個頁的基本結構圖:
頁頭部
頁頭部大小為
96位元組。在這部分我最想做的事是使用
dbcc page
來看乙個頁頭部,然後解釋一下所有的字段含義。我使用以前《
page split
》文章用的資料庫,下面是
dbbc page
部分輸出:
dbcc traceon (3604)
dbcc page ('pagesplittest', 1, 143, 1); go
m_pageid = (1:143) m_headerversion = 1 m_type = 1
m_typeflagbits = 0x4 m_level = 0 m_flagbits = 0x200
m_objid (allocunitid.idobj) = 68 m_indexid (allocunitid.idind) = 256
metadata: allocunitid = 72057594042384384
metadata: partitionid = 72057594038386688 metadata: indexid = 1
metadata: objectid = 2073058421 m_prevpage = (0:0) m_nextpage = (1:154)
pminlen = 8 m_slotcnt = 4 m_freecnt = 4420
m_freedata = 4681 m_reservedcnt = 0 m_lsn = (18:116:25)
m_xactreserved = 0 m_xdesid = (0:0) m_ghostreccnt = 0
m_tornbits = 1333613242
下面是所有欄位的解釋(注意頁中字段並不是按下面順序儲存排列的):
m_headerversionm_type
m_typeflagbitsm_levelm_flagbitsm_objid
m_indexid
m_prevpage
m_nextpagepminlenm_slotcntm_freecntm_freedatam_reservedcntm_lsnm_xactreservedm_xdesidm_ghostreccntm_tornbits
注意:我並沒有包括以
metadata
開頭的字段,因為它們並不是頁頭部的一部分。在
sql server 2005
的開發過程中,我花了大量的精力來改寫
dbcc page
命令,為了節省每個使用者在系統表中查詢物件/索引
id的時間,我在
dbcc page
中進行了查詢,並輸出最終的結果。
記錄
見我專門的文章。
行偏移陣列
有乙個很常見的誤解是頁中的記錄是按邏輯順序儲存的,這是錯誤的。還有一種誤解是乙個頁中所有可用空間總是維護成一塊連續的段,這也是錯誤的。(是的,上面的中顯示可用空間確實是乙個段,這通常是當頁是逐步填充時才會發生)
如果從頁中刪除乙個記錄,頁上剩下的記錄並不會立刻被壓緊的(
compact
)——如果插入時需要的話會插入過程會花時間壓緊的,但刪除過程不會進行壓緊操作的。
考慮乙個完全滿的頁,這表示當刪除發生時,機會造成頁中有可用空間洞。如果乙個有新記錄要插入到頁中,而頁上的乙個洞足夠大,那為什麼還要壓緊呢?直接將記錄放進去就行了。如果這個記錄需要邏輯上放在所有其他記錄的後面,而我們的插入位置卻是在中間——這不會壞了事情嗎?
不會的。因為行偏移陣列是排序的,並且每次記錄插入和刪除後都會重排。只要行偏移陣列第乙個條目指向邏輯上的第乙個記錄,就不會有事。每個條目是兩個位元組的頁中偏移——所以操作行偏移陣列比操作記錄有效多了。只有當我們知道頁中有足夠的可用空間,但這些空間分散在頁內,我們才需要壓緊記錄讓可用空間變成一整段。
乙個有趣的事實是,行偏移陣列是從頁腳部向前增長的。所以當記錄壓緊後,可用空間是從新行的頂部到行偏移陣列的尾部。
儲存引擎揭秘 基本結構之一 記錄
儲存引擎揭秘 基本結構之一 記錄 本週我將發表一系列 sql server 中用來儲存資料和跟蹤分配的基本結構。大部分文章其實當初我在 teched2006 上開博時便發表過,但是現在我想更清晰地描述它,並使用 dbcc page 來檢查各種結構。那麼,什麼是記錄?簡單地說,一條記錄就是物理儲存的表...
儲存引擎揭秘 基本結構之三 區
儲存引擎揭秘 基本結構之三 區 正文 前面的文章我介紹了資料檔案中的頁,包括頁結構和一些頁型別。現在我想解釋一下頁是如何組織成區 extent 的。乙個區是由資料檔案中 8個連續的頁組成。區從資料檔案頭部開始,並且總是 64k對齊 即 8頁對齊 區及其屬性在 sql server 2000 和200...
mysql之二 mysql中的儲存引擎
1 儲存引擎相關sql語句 檢視當前的預設儲存引擎 mysql show variables like default storage engine 查詢當前資料庫支援的儲存引擎 mysql show engines g 2 指定儲存引擎建表 在建表時指定 mysql create table ai...