sql server中的頁是最基本的資料單位組成,他有8kb,也就是8192個位元組(mssql7.0以前是乙個頁面2kb),而sql server的乙個頁面,由頁頭,資料行,和slot table組成(行偏移的位置的記錄陣列。
頁頭是乙個固定的96位元組的大小,他是乙個頁面的元資料,記載與本頁相關的許多資訊,具體的引數,大家可以參看我很久以前寫的一篇文章,
sql server資料頁頁頭引數列表
pageid:
頁面的id,在mssql中,唯一定位一行資料(包括索引)的,靠的是mssql裡面的乙個我把它稱之為的三段式表示式:fps id,即 file id,page id,slot id。file id 為檔案id,找到行所在的檔案,pageid找到行所在的頁面,slot id為插槽id,即這一行位於這個頁面的第幾個插槽。插槽的概念會在稍後提到。1:1:2表示這行資料位於第乙個檔案的第乙個頁面的第二個插槽。
nextpage:
這個引數在頁面處於頁面鏈的時候,指示這個頁面的下乙個頁面位址,這個的表達格式是 fileid:pageid,比如:1:2,請注意一下,這個頁面指標並不是完全指向物理磁碟上的頁面位址,因為外部碎片的存在!如果是堆表,那麼這兩個引數會是null。
objid:
在sysobjects 表內的對應的id
lsn:
log sequence number ,日誌序列號,他用來記錄當這個頁面行資料發生改變時的日誌記錄號,和此前版本的lsn,這個對於事務的管理非常重要,他將指示資料是否被回滾,或者被重做。
slotcnt:
頁面插槽總數。也就是這個頁面有多少行。乙個蘿蔔乙個坑,一行資料乙個槽。
level:
在索引頁中的級別,0為子葉節點。
indexed:
0為普通資料頁面(堆表),1為聚集索引頁面,大於1都為非聚集索引。
pminlen:
每行資料的固定長度,比如一行資料有3個int欄位,1個char5的字段,2個varchar欄位,那麼固定長度是17.這個引數在mssql定位字段資料時起到至關重要的作用。
freecnt:
頁面空閒的位元組數,在每次需要插入資料時就檢測這個值,空間是否夠用。
m_ghostreccnt:
插槽表是用於記錄行在頁內的邏輯順序和物理順序的對應陣列。比如邏輯上是第一行的資料可能在這個頁面內是物理上位於第二行。而這個物理上的位置,指的是在這個頁面的8kb的空間內的位置,slottable有記錄行的邏輯順序數,物理順序數,還有相對頁頭的偏移量,以便資料查詢定位。在這裡衍生的乙個問題就是,邏輯上的行順序可能儲存在磁碟上的物理順序也不會是乙個順序!(當然還有可能頁面存在lob資料,成為乙個頁指標)
猜想:slottable實際上是對空間的乙個利用,當然也涉及到了當資料行進行增刪改查時,對頁面的破壞,最後在設計上匯入了slot table。假設乙個場景,當乙個頁面全部被填充滿了,freecnt為0的時候,刪除乙個資料(頁面儲存100個資料,刪除其中的第2個),那麼如果根據正常的邏輯,應該是將2到第100行的資料全部移動,然後整理出末尾還剩一行的資料。這樣現實嗎?那樣頁面所有資料都要移動,似乎不大現實。所以mssql在設計上引入了slot table ,這樣,物理上和邏輯上的順序由slot table 對映起來,儲存引擎負責向slot table 要資料位置,slot table負責對映其真正的物理位置,slottable在其中搭建起乙個橋梁,降低了他們之間的耦合,使得當邏輯順序發生變化的時候,物理位置卻不需要相應的變化,哈哈,相信這個也是乙個典型的設計上的解耦的例子吧~~
MSSQL優化之 1 1 儲存架構之檔案和檔案組
本篇文章將由粗到細,講解資料庫的物理組成結構。有些東西可能是廢話或是摘抄自bol,等權威文章,但是作為乙個知識體系結構,還是需要囉嗦一下。資料庫是由一系列的檔案組成,檔案組是檔案的管理單元,類似於命名空間,但很不幸的是微軟沒有在檔案組這個管理單元上賦予更多的權力,比如許可權管理。而資料庫的許可權管理...
MSSQL優化之索引優化
1。用count 統計比用count 字段 快。用count 主鍵 速度最快!2。select cid,title,cnt from table where cid 9999999 or riqi 2004 9 16 select cid,title,cnt from table where cid...
mysql之優化 儲存引擎
1.2 myisam 與 innodb 主要區別 1.3 如何選擇mysql的儲存引擎 目前廣泛使用的是myisam和innodb兩種引擎 1.1.1 myisam myisam引擎是mysql 5.1及之前版本的預設引擎,它的特點是 1.1.2 innodb innodb在mysql 5.5後成為...