SQL Server 2008儲存結構之IAM結構

2021-09-03 07:26:43 字數 3820 閱讀 1190

索引分配對映(index allocation map,iam)頁面在4 gb的區間中跟蹤被乙個分配單元所使用的區。乙個分配單元就是一組頁面,這些頁面屬於乙個資料表或索引的單個分割槽。它由下面三種型別頁面中的一種組成:含 有常規的行內資料的頁面、含有大型物件(large object,lob)資料的頁面和含有行溢位資料的頁面。 其實sql server的資料頁面型別與oracle的段的概念有些類似,乙個物件包含若干段,而乙個段只能屬於乙個物件。

假如一張在四個分割槽上 的含有所有三種型別的資料(行內資料、lob資料和行溢位資料)的表將會有至少12個iam頁面。單張iam頁面也是僅僅覆蓋單個檔案的4gb區間,所以 如果分割槽跨越多個檔案,那麼就會有多個iam頁面,同時如果檔案大小超過4gb,並且分割槽使用了乙個4 gb區間以外的資料頁,那麼也將會有額外的iam資料頁。

乙個iam資料頁包含乙個頁頭(iam頁頭),該頁頭包含有8個頁面指標槽, 還有一組位元位用來將乙個範圍內的區對映到乙個檔案,這個檔案並不必一定就是iam頁面所在的那個檔案。頁頭包含有在iam對映範圍內的第乙個區的位址。 8個頁面指標槽可能包含指向某些屬於相關物件頁面的指標,這些物件被包含在混合型別的區中,對乙個物件來說,只有第乙個iam頁面含有這些指標的值。一旦 乙個物件占用的頁面超過8個,它所有的區都會是統一型別的區——這意味著乙個物件決不會需要超過8個指標來指向處於混合型別區中的頁面。如果一張表中的數 據行已被刪除,該錶實際上可以使用的指標數不到8個。位元位對映中的每乙個位元位代表了該範圍內的乙個區,而不論該區是否被分配給了擁有該iam的物件。 如果乙個位元位是開啟的,那麼在此範圍內相關的區就是被分配給擁有 iam的物件的;如果乙個位元位是關閉的,那麼此範圍內相關的區沒有被分配給擁有該iam的物件。

iam頁面在需要的時候被分配給每乙個物件,並且位於資料庫中的隨機位置。每乙個iam頁面覆蓋的可能範圍大約是512 000個頁面。

看概念總歸是比較枯燥的,我們可以構建乙個具體的例子。

在構建例子之前我們首先需要建立乙個把位址轉換為具體頁碼的函式。

create function [dbo].f_get_page(@page_num binary(6))

returns varchar(11)

asbegin

return(convert(varchar(2),(convert(int,substring(@page_num,6,1))*power(2,8))+

(convert(int,substring(@page_num,5,1))))+':'+

convert(varchar(11),

(convert(int,substring(@page_num,4,1))*power(2,24))+

(convert(int,substring(@page_num,3,1))*power(2,16))+

(convert(int,substring(@page_num,2,1))*power(2,8))+

(convert(int,substring(@page_num,1,1)))))

end--根據master.sys.objects構建一張叫testiam的資料表

select * into testiam from master.sys.objects   

--然後我們根據之前所知曉的資訊,獲取testiam物件的iam位址,並根據f_get_page函式將位址轉換為相應的頁面

select total_pages,used_pages,data_pages,

first_page,root_page,first_iam_page,

testdb.dbo.f_get_page(first_page) first_page_address,

testdb.dbo.f_get_page(root_page) root_address,

testdb.dbo.f_get_page(first_iam_page) iam_address

from sys.system_internals_allocation_units

where container_id in (select partition_id from sys.partitions

where object_id in (select object_id  from sys.objects

where name in ('testiam')))

dbcc page(testdb,1,80,3)

從dbcc page(testdb,1,80,3)可以得到以下資訊

因為master.sys.objects的物件只有49條資料,所以只分配了2個頁面,根據前文所述,分配8個頁面(包括8)以內的物件,sql server將以把該物件的資料分配到混合型別的分割槽上,如上sql server給予testiam表只分配了第乙個檔案的第77和第89個頁面,而並沒有分配同一型別的分割槽的頁面。  

假如我們master.sys.objects的資料反覆插入testiam表,讓我們觀察一下相應的頁面分配情況。

declare @maxtime int

set @maxtime=0

while @maxtime<20

begin

insert into testiam select * from sys.objects

set @maxtime=@maxtime+1

endselect * from testiam

--我們首先還是執行以下system_internals_allcation_units系統表

select total_pages,used_pages,data_pages,

first_page,root_page,first_iam_page,

testdb.dbo.f_get_page(first_page) first_page_address,

testdb.dbo.f_get_page(root_page) root_address,

testdb.dbo.f_get_page(first_iam_page) iam_address

from sys.system_internals_allocation_units

where container_id in (select partition_id from sys.partitions

where object_id in (select object_id  from sys.objects

where name in ('testiam')))

--通過上面的結果,我們可以觀察到這次sql server共分配了17個頁面,其中使用了15個頁面,而資料頁面只有14個,這是為什麼呢?

--接著我們再次執行dbcc page命令

dbcc page(testdb,1,80,3)

結果如下

從上述我們可知,slot 0到slot 7一共分配了8個混合型別區的頁面,由於已經超過8頁,所以sql server再次分配空間時,就會把同一型別的區分配給該物件,乙個區包括8個頁面,所以sql server為testiam表共分配了16個頁面,資料頁面14個,已使用的頁面除了資料頁面還包括該錶的乙個iam管理頁面。

還是通過internals viewer外掛程式讓我們看一下iam頁的情況吧

比較有意思的是sql server 2008為什麼不從一開始就為每乙個物件分配同一型別的頁面,僅僅是為了節約空間?還是為了與之前版本的相容性?就不得而知了。

儲存過程 SQL SERVER 2008

一 實驗題目 儲存過程 二 實驗目的 熟悉儲存過程的定義和使用,熟練運用 select update insert delete 命令完成對學生資訊資料庫的查詢 更新 新增 刪除操作。題目六 藥品 編號,名稱,廠商 處方 藥品編號,數量,醫生編號 醫生 編號,姓名,科室,職稱 根據上面基本表的資訊定...

SQL Server 2008儲存結構之PFS結構

pfs page free space 也叫頁面自由空間,該頁面用來跟蹤乙個檔案中每乙個特定的頁面的利用率情況。乙個檔案中第二個頁面 頁碼1 就是pfs頁面,該頁面的每個 位元組都記錄了相應頁面的分配情況 頁面型別 是否iam頁 是否包含刪除記錄 以及空間利用率資訊 pfs能夠管理和跟蹤8088個頁...

Sql Server 2008 常用系統儲存過程

sp add log file recover suspect lib 當資料庫的復原不能完成時,向檔案組增加乙個日誌檔案 sp add targetservergroup 增家指定的伺服器組 sp add targetsvrgrp member 在指定的目標伺服器組增加乙個目標伺服器 在資料庫裡增...