4. SQL SERVER存儲引擎之數據篇指針
(4.1)文件日誌
(0)主數據文件.mdf初始文件大小至少爲3MB,次要數據文件.ndf初始大小,同日志文件同樣至少爲512KB;xml
(1)SQL SERVER在邏輯上用文件組將文件分批管理(相似ORACLE的TABLESPACE),一個文件組能夠包含多個文件,插入數據時,同一個文件組內的全部文件等比例增加。例如:文件組中有兩個文件,初始大小分別爲100M和200M,此時插入3M的數據,file1新增(100/300)*3M=1M,file2新增(200/300)*3M=2M。對象
(2)頁(page),SQL SERVER中的數據文件由8K大小的數據頁組成,每一個數據文件中的頁從0開始編號,頁大小不能夠自定義,且每一個頁只屬於一個數據對象。blog
(3)區(extent),或者叫擴展,8個物理上連續的頁爲一個擴展,即64k;擴展的存在是爲了不不停的分配8k的頁面,提升頁面分配的效率。SQL SERVER有兩種類型的區,以下圖: 索引
混合區:爲了節約空間,將少許數據的表或索引存放在混合區,當表或索引的數據增加到8頁時,再使用統一區來存放,一個混合區有8個頁,每一個頁能夠屬於不一樣的數據對象,即每一個混合區最多爲8個數據對象共享。it
統一區:由單個數據對象全部,若是對錶中現有數據建立索引,且索引的大小超過8頁,則索引將所有使用統一區,沒有混合區的分配過程。io
(4.2)頁table
(4.2.1)非數據頁test
(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--------------------------------------------------------------------------------------