1. 程式人生 > >sqlserver 大欄位儲存格式(二)

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

63 63636363 63636363 6363636363636363 ...ccccccccccccccccc

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的頁裡面指標指向的是具體的資料頁,裡面包含了具體的資料。