標籤:
4. SQL SERVER儲存引擎之資料篇
(4.1)檔案
(0)主要資料檔案.mdf初始檔案大小至少為3MB,次要資料檔案.ndf初始大小,同記錄檔一樣至少為512KB;
(1)SQL SERVER在邏輯上用檔案組將檔案分批管理(類似ORACLE的TABLESPACE),一個檔案組可以包含多個檔案,插入資料時,同一個檔案組內的所有檔案等比例增長。例如:檔案組中有兩個檔案,初始大小分別為100M和200M,此時插入3M的資料,file1新增(100/300)*3M=1M,file2新增(200/300)*3M=2M。
(2)頁(page),SQL SERVER中的資料檔案由8K大小的資料頁組成,每個資料檔案中的頁從0開始編號,頁大小不可以自訂,且每個頁只屬於一個資料對象。
(3)區(extent),或者叫擴充,8個物理上連續的頁為一個擴充,即64k;擴充的存在是為了避免不停的分配8k的頁面,提高頁面分配的效率。SQL SERVER有兩種類型的區,如:
混合區:為了節約空間,將少量資料的表或索引存放在混合區,當表或索引的資料增長到8頁時,再使用統一區來存放,一個混合區有8個頁,每個頁可以屬於不同的資料對象,即每個混合區最多為8個資料對象共用。
統一區:由單個資料對象所有,如果對錶中現有資料建立索引,且索引的大小超過8頁,則索引將全部使用統一區,沒有混合區的分配過程。
(4.2)頁
(4.2.1)非資料頁
(0)檔案頭,每個資料檔案的第一頁,頁號為0,該頁主要包括當前檔案的屬性描述,比如:檔案組ID、檔案ID、檔案當前大小、檔案最大/最小值、檔案增量、一系列的LSN等;
(1)頁面空閑空間(PFS),每個資料檔案的第二頁,頁號為1,該頁記錄當前資料檔案每個資料頁的空間狀態:該頁是為空白、已滿1%到50%、已滿51%到80%、已滿81%到95%,還是已滿96%到100%。PFS頁內用1個位元組來描述1個資料頁的分配及空間狀態,每個PFS頁約有可用空間8088個位元組,即資料檔案內約每64M的空間會出現一個PFS頁。
(2)全域分配映射(GAM),每個資料檔案的第3頁,頁號為2,該頁記錄當前資料檔案每個區的分配狀態,0為已使用(作為混合區或統一區),1為未使用(自由區,未分配)。
(3)共用分配映射(SGAM),每個資料檔案的第4頁,頁號為3,該頁記錄當前資料檔案哪些區被用作混合區,1為含有自由頁面的混合區,0為自由區或已滿的混合區。
(4)索引配置對應(IAM),該頁跟蹤資料檔案中的頁屬於哪個資料對象,IAM頁頭有8個頁面指標,指向資料對象在混合區中的資料頁(如果混合區中的資料被刪除可能少於8個指標),IAM頁內位元位為1表示該區屬於自己所屬的資料對象,位元位為0表示該區不屬於自己所屬的資料對象。
(4.1)每個資料對象的每個配置單位擁有一個IAM頁,IAM同GAM、SGAM一樣可以管理約4G的空間,如果配置單位包含多個檔案,或者檔案大小超過4G,則需要另外的IAM頁來管理,IAM頁間通過雙向鏈表串連;
(4.2)可以通過sysindexes或sys.system_internals_allocation_units系統目錄得到first_IAM頁面的位置,IAM頁在資料檔案中的位置是隨機的,可能IAM頁所在檔案並不是所管理的那個檔案;
(5)差異更改映射(DCM),每個資料檔案的第7頁,頁號為6(頁號4,5為保留頁),該頁跟蹤當前資料檔案中,自上次全備份後被修改的區,以提高差異備份的效率,1為被修改過,0為未被修改;
(6)大批量更改映射(BCM),每個資料檔案的第8頁,頁號為7,該頁跟蹤當前資料檔案中,自上次記錄備份後被大大量操作修改的區,1為被修改過,0為未被修改;
(4.2.2)資料頁
(0)資料頁包含頁頭、資料行、行位移矩陣三部分,如:
(1)行內資料(IN_ROW_DATA),單行未超過8060B的資料行,或者單行超過8060B但仍儲存在當前頁的資料,稱為行內資料;
(2)資料列溢位資料(ROW_OVERFLOW_DATA),在SQL SERVER2005及以後的版本中,如果表中定義了變成的資料類型,允許單行資料長度突破8060B,超過的部分即為資料列溢位資料,如果變長列被更新後縮短,可能會被移回行內資料頁(通常減少1000位元組以上時,SQL SERVER才會有檢查是否可移回)。
(3)大對象資料(LOB_DATA),存放如text/image/xml/varchar(max)等最大長度可超過8000B的資料類型的資料;
大對象資料也是通過8k的資料頁來存放資料,在行內資料頁中包含一個16位元組的指標指向大對象資料的根頁,大對象資料通過B-樹結構來組織多個資料頁;
可以通過開啟text in row選項將大對象資料存放區在行內資料頁,當大對象資料被更新超過500B時,則會從行內資料頁將大對象資料移出,這是個日誌操作,因此移動操作比較耗時,所以不建議開啟該選項;
(4)資料行
每個資料行,除了每個列的資料之外,還包括狀態位、定長列位移量、總列數、NULL位元影像、變長列數、列位移矩陣,這些即為行開銷。
建立全定長列的表,資料行如:
if object_id (‘test_col‘) is not null
drop table test_col;
GO
create table test_col
(
col1 char(1),
col2 char(2)
)
GO
insert into test_col values(‘A‘,‘B‘)
--------------------------------------------------------------------------------------
原文轉自:http://qianzhang.blog.51cto.com/317608/1217346
--------------------------------------------------------------------------------------
SQL SERVER儲存引擎——資料