<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一江春水向東流

    做一個有思想的人,期待與每一位熱愛思考的人交流,您的關注是對我最大的支持。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      44 隨筆 :: 139 文章 :: 81 評論 :: 0 Trackbacks
    此分析稱為簡易版,因為后面還計劃分析一個更復雜的數據庫文件,以深入理解SQLite數據庫B樹實現的結構,從簡易的開始不失為一種好的學習方法,這里的簡易版本文件是指大小為2K字節,即每個B樹頁1K字節,共兩個B樹頁,補充說明一下,這里的B樹頁就是指經典數據結構書上所講的B樹節點,在這里稱為頁是因為SQLite在實現B樹時就是使用頁page的概念來組織的。
    創建方法如下:
    CREATE TABLE tbl1(one varchar(10),two varchar(10));
    INSERT INTO "tbl1" VALUES('first', 'xxx');
    INSERT INTO "tbl1" VALUES('second', 'yyy');

    然后退出,用UltraEdit打開這個數據庫文件:
    00000000h: 53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00 ; SQLite format 3.
    00000010h: 04 00 01 01 00 40 20 20 00 00 00 07 00 00 00 00 ; .....@? ........
    00000020h: 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 01 ; ................
    00000030h: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ; ................
    00000040h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
    00000050h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
    00000060h: 00 00 00 00 0D 00 00 00 01 03 B8 00 03 B8 00 00 ; ..........?.?.
    00000070h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
    這中間部分全部都是零。省去!
    000003a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
    000003b0h: 00 00 00 00 00 00 00 00 46 01 06 17 15 15 01 71 ; ........F......q
    000003c0h: 74 61 62 6C 65 74 62 6C 31 74 62 6C 31 02 43 52 ; tabletbl1tbl1.CR
    000003d0h: 45 41 54 45 20 54 41 42 4C 45 20 74 62 6C 31 28 ; EATE TABLE tbl1(
    000003e0h: 6F 6E 65 20 76 61 72 63 68 61 72 28 31 30 29 2C ; one varchar(10),
    000003f0h: 74 77 6F 20 76 61 72 63 68 61 72 28 31 30 29 29 ; two varchar(10))
    ???? 這是第一個B樹頁,這個B樹頁里存放了表sqlite_master的信息,這就是SQLite數據庫的系統表了。
    下面分析一下這些二進制的具體涵義,SQLite統一采用大端法來表示數據,不同與一般intel機器的小端法了:
    偏移地址?? 大小??? 涵義
    ?0????????? 16???? "SQLite format 3\000"
    16?????????? 2???? 400H=1024個字節,每個頁面的字節數?
    18?????????? 2???? 0101H表示版本號而已
    20?????????? 1???? 每頁末端的未用空間,這里為零表示數據都是從每頁最后一個字節開始存放
    21?????????? 1???? 最大負載分片數,類似與IP分片,一頁存不下,要分片
    22?????????? 1???? 最小負載分片數
    23?????????? 1???? 最小葉子負載分片數
    24?????????? 4???? 文件修改計數,用于實現并行訪問
    28?????????? 4???? 保留未用
    32?????????? 4???? 第一個freelist頁
    36?????????? 4???? 文件中的freelist頁數
    40????????? 60???? 這里未用
    上面的這一百個字節稱為數據庫文件的文件頭,這個文件頭只有第一個B樹頁才有,后面的每一個B樹頁都沒有這個結構,后面每一頁結構都相同:
    依次為:B樹頁頭結構,B樹指針結構,未用空間,B樹實際數據負載。
    這里和經典數據結構書上的B樹結構有些出入,這里的目的是實際應用方便,而書上的結構目的是解釋清楚B樹的原理。所以有些不同:
    一般書上講的一個B樹頁的結構為:指針,數據,指針,數據,指針,數據,...,指針
    而SQLite組織為:指針,指針,指針,...,指針,數據,數據,...數據。
    第一個頁面中從00000060h行第五個字節開始就表示B樹頁頭結構了:
    偏移地址?? 大小??? 涵義
    0?????????? 1????? 0Dh=1101b各位意義為1: intkey, 2: zerodata, 4: leafdata, 8: leaf
    1?????????? 2????? 第一個空閑塊的字節偏移量,這里為0
    3?????????? 2????? 01,這個B樹頁存放的記錄數為1個,即系統表中只存放了一條記錄,因為只創建了一個表tbl1
    5?????????? 2????? 負載區首地址,03B8,往下看到000003b0h行那個46就是負載區的開始了
    7?????????? 1????? 分片數,這里數據少,不考慮,所以為0
    到0000006Bh偏移處B數頭結束了,接下來的就是B數指針結構了,此處只有一項,只有一個指針03B8h處。
    從000003B8h偏移到結束都是sqlite_master表的實際數據了。當然這些數據也是有結構的。46h表示這條記錄有70個字節,除去其本身46,和后面的01是索引外,整個記錄剛好是70個字節,01索引后面都是payload負載數據了。
    如法炮制,下面列出第二個B樹頁:
    00000400h: 0D 00 00 00 02 03 E5 00 03 F3 03 E5 00 00 00 00 ; ......?.??...
    00000410h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
    這中間部分全部為零。省去!
    000007d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
    000007e0h: 00 00 00 00 00 0C 02 03 19 13 73 65 63 6F 6E 64 ; ..........second
    000007f0h: 79 79 79 0B 01 03 17 13 66 69 72 73 74 78 78 78 ; yyy.....firstxxx
    由于不是第一頁,所以不存在文件頭的100個字節了,一開始就是B樹頁頭結構了,這里有兩個指針03F3和03E5,其它的和上面一樣。整個數據庫管理系統就是準確無誤地對這個文件進行管理。
    進一步的工作:只有數據多了,才能看出B樹組織的好處:查找,刪除,增加的快速!把這個文件變大再分析!
    posted on 2008-03-27 16:37 allic 閱讀(573) 評論(0)  編輯  收藏 所屬分類: 算法及數據結構開源數據庫學習研究
    主站蜘蛛池模板: 亚洲精品无码久久久久A片苍井空| 亚洲中文字幕无码久久综合网| 亚洲性色高清完整版在线观看| a毛片免费播放全部完整| 久久久久亚洲AV成人网人人网站| 老司机免费午夜精品视频| 免费大黄网站在线看| 免费无码专区毛片高潮喷水| 免费一级做a爰片久久毛片潮喷| 国产精品亚洲一区二区三区久久| 日美韩电影免费看| 精品久久亚洲一级α| 国产jizzjizz视频全部免费| 亚洲AV无码男人的天堂| 国产免费69成人精品视频| 麻豆69堂免费视频| 中文字幕亚洲无线码| 久久精品国产大片免费观看| 久久国产亚洲高清观看| 无码国产精品一区二区免费式直播| 亚洲精品在线不卡| 日本一道一区二区免费看 | 美女被爆羞羞网站在免费观看| 亚洲国产成人久久一区久久| 高清永久免费观看| 亚洲资源在线视频| 美女被免费视频网站a国产| 国产亚洲精品仙踪林在线播放| 久久久久亚洲av成人无码电影| 国产成人免费ā片在线观看老同学| 亚洲成人中文字幕| 成人免费在线观看网站| 欧洲美女大片免费播放器视频| 亚洲色成人网站WWW永久| 亚洲视频在线免费播放| 亚洲精品国产精品| 国产V亚洲V天堂A无码| 成年人性生活免费视频| 国产精品成人啪精品视频免费| 亚洲精品无码久久毛片波多野吉衣 | 免费va人成视频网站全|