sqlserver 大欄位儲存格式(二)
lob資料單行的儲存格式
lob資料頁的測試方法遵循上一篇overflow相同的方法:
- 測試指令碼:
create table dbo.hugerows
(
a varchar(80),
b nvarchar(max),
c varchar(80),
d varchar(80)
);
insert into dbo.hugerows
select replicate('a',30), replicate('b',251658240),--30M
replicate('c',30),replicate('d',30);
--確認SQLServer是否在行溢位資料頁中儲存某個特殊表中的資料
select object_name(object_id) as name,
partition_id, partition_number as pnum, rows,
allocation_unit_id as au_id, type_desc as page_type_desc,
total_pages as pages
from sys.partitions p join sys.allocation_units a
on p.partition_id = a.container_id
where object_id=OBJECT_ID('dbo.hugerows')
dbcc ind (Simple, hugerows, -1)
DBCC TRACEON (3604);
dbcc page ('Simple', 1, 2197, 3)
page(2179)
0000000000000000: 3000040004000004 002f0053 8071008f 00616161 0......../.S.q...aaa
0000000000000014: 6161616161616161 61616161 61616161 61616161 aaaaaaaaaaaaaaaaaaaa
0000000000000028: 6161616161616104 00003c01 00000002 44000068 aaaaaaa...<.....D..h
000000000000003C: 1f000094 08000001 00000080 3e00008f 08000001 ............>.......
0000000000000050: 000000
0000000000000064: 6363636363636363 63636363 63646464 64646464 cccccccccccccddddddd
0000000000000078: 6464646464646464 64646464 64646464 64646464 dddddddddddddddddddd
000000000000008C: 646464 ddd
lob資料頁和overflow資料頁差不多,中間也是存的一個指向lob頁的指標:
前12個位元組和overflow指標格式一樣,而後面多了一些,並且後面頁面的長度是總長度,是前幾個頁面(包括當前頁面)之和。
注:中間紅色的檔案編號和槽編號目前沒有可靠依據
lob tree資料頁
- 測試方法遵循overflow相同的方法:
測試指令碼:create table dbo.hugerows
(
a varchar(80),
b nvarchar(max),
c varchar(80),
d varchar(80)
);
declare @A nvarchar(max)
set @A=replicate(CONVERT(nvarchar(max),'1'),POWER(2,28)); --128M
insert into dbo.hugerows
select replicate('a',30), @A,
replicate('c',30), replicate('d',30);
1. dbcc ind (Simple, hugerows, -1):
我們來看Page Type 為1的頁面,儲存格式和上面的lob資料一樣,存放了一個lob指標,頁為BLOB Inline Root,level為2,指向1:2170頁
2. 而2170頁格式是這樣的:PAGE: (1:2170)
. . . . . . //此處省略96位元組的頁頭資訊
Blob row at: Page (1:2170) Slot 0 Length: 2164 Type: 2 (INTERNAL)
Blob Id: 209387520 Level: 1 MaxLinks: 501 CurLinks: 134
Child 0 at Page (1:2187) Slot 0 Size: 4020000 Offset: 4020000
Child 1 at Page (1:2188) Slot 0 Size: 4020000 Offset: 8040000
Child 2 at Page (1:2189) Slot 0 Size: 4020000 Offset: 12060000. . . . . .
Child 132 at Page (1:64478) Slot 0 Size: 4020000 Offset: 534660000
Child 133 at Page (1:64479) Slot 0 Size: 2210912 Offset: 536870912
DBCC 執行完畢。如果 DBCC 輸出了錯誤資訊,請與系統管理員聯絡。
3. 上圖顯示了頁的資料資訊,除了96位元組的頭資訊後,緊接著是紫色框裡的20個位元組的資訊:存放的是此圖上面標黃的兩行此頁所存的lob頁面資訊總覽;maxlinks表示此頁可以存多少指標連結,curlinks表示此頁已經存了多少,level是b樹中級別,此頁級別為1,所以屬於中間節點,每個連結指向的一頁是葉節點;指標格式如下
4. 而緊接著這20位元組指標後面的一個個16位元組的指標,便是具體的每個連結,包含頁偏移,和頁號,格式如下:
5. 上面一頁的連結指向葉節點的一個連結頁的格式和上面相同,只不過level為0,而這level0的頁裡面指標指向的是具體的資料頁,裡面包含了具體的資料。