sqlite页面格式分析

B+树内部页格式分析

指针数组内容为:

0FFA0FF4 0FEE0FE8 0FE20FDC 0FD60FD0 0FCA0FC4 0FBE0FB8 0FB20FAC 0FA60FA0 0F9A

指针数组指向的单元的内容为:

0F9AH   地址:8090
0000 0013A177   (格式为:指针+key,即Ptr(0),Key(0))
0FA0H   地址:8096        Ptr(1) Key(1)
00000012 9F78               Ptr(2)  Key(2)
0FA6H   地址:8102
0000 00119D79 
0FACH   地址:8108
00000010 9B7A
0FB2H   地址:8114
0000 000F997B 
0FB8H   地址:8120
0000000E 977C
0FBEH   地址:8126
0000 000D957D 
0FC4H   地址:8132
0000000C 937E
0FCAH   地址:8138
0000 000B917F 
0FD0H   地址:8144
0000000A 9000
0FD6H   地址:8150
0000 00098E01 
0FDCH   地址:8156
00000008 8C02
0FE2H   地址:8162
0000 00078A03 
0FE8H   地址:8168
00000006 8804
0FEEH   地址:8174
0000 00058605 
0FF4H   地址:8180
00000004 8406
0FFAH   地址:8186
0000 00038207 

最右孩子页号是:00000014

经过格式分析知,B+树的内部页格式是Point + key构成的。最后在加Ptr(N),即最右孩子页号(也是一个指针)

B+树叶子页

对应的指针数组内容为:

0FF30FCC 0FE60FD9 0FBF0FB2 0FA50F98 0F8B0F7E 0F710F64 0F570F4A 0F3D0F30 0F230F16 0F090EFC 0EEF0EE2 0ED50EC8 0EBB0EAE 0EA10E94 0E870E7A 0E6D0E60 0E530E46 0E390E2C 0E1F0E12 0E050DF8 0DEB0DDE 0DD10DC4 0DB70DAA 0D9D0D90 0D830D76 0D690D5C 0D4F0D42 0D350D28 0D1B0D0E 0D010CF4 0CE70CDA 0CCD0CC0 0CB30CA6 0C990C8C 0C7F0C72 0C650C58 0C4B0C3E 0C310C24 0C170C0A 0BFD0BF0 0BE30BD6 0BC90BBC 0BAF0BA2 0B950B88 0B7B0B6E 0B610B54 0B470B3A 0B2D0B20 0B130B06 0AF90AEC 0ADF0AD2 0AC50AB8 0AAB0A9E 0A910A84 0A770A6A 0A5D0A50 0A430A36 0A290A1C 0A0F0A02 09F509E8 09DB09CE 09C109B4 09A7099A 098D097F 09710963 09550947 0939092B 091D090F 090108F3 08E508D7 08C908BB 08AD089F 08910883 08750867 0859084B 083D082F 08210813 080507F7 07E907DB 07CD07BF 07B107A3 07950787 0779076B 075D074F 07410733 07250717 070906FB 06ED06DF 06D106C3 06B506A7 0699068B 067D066F 06610653 06450637 0629061B 060D05FF 05F105E3 05D505C7 05B905AB 059D058F 05810573 05650557 0549053B 052D051F 05110503 04F504E7 04D904CB 04BD04AF 04A10493 04850477 0469045B 044D043F 04310423 04150407 03F903EB 03DD03CF 03C103B3 03A50397 0389037B 036D035F 03510343 03350327 0319030B 02FD02EF 02E102D3 02C502B7 02A9029B 028D027F 02710263 02550247 0239022B 021D

部分payload内容:

0F8BH   地址:12171
0B 0903001D 7A68616E 6773616E 
0F98H   地址:12184
0B080300 1D7A6861 6E677361 6E
0FA5H   地址:12197
0B0703 001D7A68 616E6773 616E
0FB2H   地址:12210
0B06 03001D7A 68616E67 73616E
0FBFH   地址:12223
0B 0503001D 7A68616E 6773616E 
0FCCH   地址:12236
0B020300 1D7A6861 6E677361 6E
0FD9H   地址:12249
0B0403 001D7A68 616E6773 616E
0FE6H   地址:12262
0B03 03001D7A 68616E67 73616E
0FF3H   地址:12275
0B 0103001D 7A68616E 6773616E 

index页的内部页

上图中第一个空闲块的地址应改为第一个自由块的地址较好。

指针数组内容(阴影部分):

0FEE0FDC 0FCA0FB8 0FA60F94 0F820F70 0F5E0F4C 0F3A0F28 0F160F04 0EF20EE0 0ECE

因为1页4096B,又因为十六进制14H = 1 * 16 + 4 == 20,而页面的下标从1开始,所以这个内部页是第21页

执行自己编写的程序,输出指针数组中每个指针指向的内容:

最右孩子页号00000027,对应到内存中地址是00000026

0ECEH   地址:85710
0000 00260D03 1D027A68 616E6773 616E1107      (红色标注的00000026指的是实际的页号(下标从1开始),而转换到内存地址中的下标是从0开始的,所以内存中对应0000025
0EE0H   地址:85728
00000025 0D031D02 7A68616E 6773616E 1008
0EF2H   地址:85746
0000 00240D03 1D027A68 616E6773 616E0F08 
0F04H   地址:85764
00000023 0D031D02 7A68616E 6773616E 0E08
0F16H   地址:85782
0000 00220D03 1D027A68 616E6773 616E0D08 
0F28H   地址:85800
00000021 0D031D02 7A68616E 6773616E 0C08
0F3AH   地址:85818
0000 00200D03 1D027A68 616E6773 616E0B08 
0F4CH   地址:85836
0000001F 0D031D02 7A68616E 6773616E 0A08
0F5EH   地址:85854
0000 001E0D03 1D027A68 616E6773 616E0908 
0F70H   地址:85872
0000001D 0D031D02 7A68616E 6773616E 0808
0F82H   地址:85890
0000 001C0D03 1D027A68 616E6773 616E0708 
0F94H   地址:85908
0000001B 0D031D02 7A68616E 6773616E 0608
0FA6H   地址:85926
0000 001A0D03 1D027A68 616E6773 616E0508 
0FB8H   地址:85944
00000019 0D031D02 7A68616E 6773616E 0408
0FCAH   地址:85962
0000 00180D03 1D027A68 616E6773 616E0308 
0FDCH   地址:85980
00000017 0D031D02 7A68616E 6773616E 0207
0FEEH   地址:85998
0000 00160D03 1D027A68 616E6773 616E0107,可知,index页内部页的payload区域总共有4中类型的数据项(Field),也可以称为字段,首先是子页的页号,00000016代表子页号,0D代表payload的大小,即13Byte,03代表其后有3个字节(包括自己),分别是031D02,1D= (16 + 13 - 13)/2 =8(zhangsan)。02代表有2个字节的整数 然后是被添加索引的字段的值,最后是1007(未知)

实际上他的子页号从00000016H到00000026H,对应到页面中绝对地址就是00000015H到00000025H,最右孩子页号00000027H,对应到绝对地址就是00000026H(之所以前面加那么多0,是因为sqlite规定页面号占据32bit,即32个比特位,即4B,即4字节)

index页的叶子页

指针数组内容(阴影部分):

0FF20FE4 0FD60FC8 0FBA0FAC 0F9E0F90 0F820F74 0F660F58 0F4A0F3C 0F2E0F20 0F120F04 0EF60EE8 0EDA0ECC 0EBE0EB0 0EA20E94 0E860E78 0E6A0E5C 0E4E0E40 0E320E24 0E160E08 0DFA0DEC 0DDE0DD0 0DC20DB4 0DA60D98 0D8A0D7C 0D6E0D60 0D520D44 0D360D28 0D1A0D0C 0CFE0CF0 0CE20CD4 0CC60CB8 0CAA0C9C 0C8E0C80 0C720C64 0C560C48 0C3A0C2C 0C1E0C10 0C020BF4 0BE60BD8 0BCA0BBC 0BAE0BA0 0B920B84 0B760B68 0B5A0B4C 0B3E0B30 0B220B14 0B060AF8 0AEA0ADC 0ACE0AC0 0AB20AA4 0A960A88 0A7A0A6C 0A5E0A50 0A420A34 0A260A18 0A0A09FC 09EE09E0 09D209C4 09B609A8 099A098C 097E0970 09620954 09460938 092A091C 090E0900 08F208E4 08D608C8 08BA08AC 089E0890 08820874 08660858 084A083C 082E0820 08120804 07F607E8 07DA07CC 07BE07B0 07A20794 07860778 076A075C 074E0740 07320724 07160708 06FA06EC

十六进制树26对应的十进制数是:2 * 16 + 6 == 38,38 + 1 = 39,所以这是第39页

由于内容太多,所以从地址大处截取的内容:

0F58H   地址:159576
0D031D02 7A68616E 6773616E 1113
0F66H   地址:159590
0D03 1D027A68 616E6773 616E1112 
0F74H   地址:159604
0D031D02 7A68616E 6773616E 1111
0F82H   地址:159618
0D03 1D027A68 616E6773 616E1110 
0F90H   地址:159632
0D031D02 7A68616E 6773616E 110F
0F9EH   地址:159646
0D03 1D027A68 616E6773 616E110E 
0FACH   地址:159660
0D031D02 7A68616E 6773616E 110D
0FBAH   地址:159674
0D03 1D027A68 616E6773 616E110C 
0FC8H   地址:159688
0D031D02 7A68616E 6773616E 110B
0FD6H   地址:159702
0D03 1D027A68 616E6773 616E110A 
0FE4H   地址:159716
0D031D02 7A68616E 6773616E 1109
0FF2H   地址:159730
0D03 1D027A68 616E6773 616E1108 ,可知,index页面的叶子页payload区域,0D代表payload的大小,即13Byte,03代表其后有3个字节(包括自己),其中,1D代表type1,02代表type2,7A68616E6773616E代表value1,1108代表value2.

第16H页,有疑问,格式混乱

0C03 1D017A68 616E6773 616E07
0FA7H   地址:90023
0C 031D017A 68616E67 73616E06 
0FB4H   地址:90036
0C031D01 7A68616E 6773616E 05
0FC1H   地址:90049
0C031D 017A6861 6E677361 6E04
0FCEH   地址:90062
0C03 1D017A68 616E6773 616E03
0FDBH   地址:90075
0C 031D017A 68616E67 73616E02 
0FE8H   地址:90088
0B031D09 7A68616E 6773616E 
0FF4H   地址:90100
0B031902 77616E67 6572020D 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值