儲存引擎揭秘 基本結構之二 頁

2021-09-30 08:59:01 字數 2537 閱讀 5887

儲存引擎揭秘:基本結構之二——頁

繼續儲存引擎揭秘系列,今天討論頁結構。頁是用來儲存記錄的。乙個頁是資料庫檔案中的乙個

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...