sqlite Btree結構分析


Btree結構中最要包含一個BtShared結構,該結構包含了一個打開的數據庫的所有頁面相關信息。

View Code
struct BtShared {
  Pager *pPager;        /* The page cache */
  BtCursor *pCursor;    /* A list of all open cursors */
  MemPage *pPage1;      /* First page of the database */
  u8 inStmt;            /* True if we are in a statement subtransaction */
  u8 readOnly;          /* True if the underlying file is readonly */
  u8 maxEmbedFrac;      /* Maximum payload as % of total page size */
  u8 minEmbedFrac;      /* Minimum payload as % of total page size */
  u8 minLeafFrac;       /* Minimum leaf payload as % of total page size */
  u8 pageSizeFixed;     /* True if the page size can no longer be changed */
#ifndef SQLITE_OMIT_AUTOVACUUM
  u8 autoVacuum;        /* True if database supports auto-vacuum */
#endif
  u16 pageSize;         /* Total number of bytes on a page */
  u16 usableSize;       /* Number of usable bytes on each page */
  int maxLocal;         /* Maximum local payload in non-LEAFDATA tables */
  int minLocal;         /* Minimum local payload in non-LEAFDATA tables */
  int maxLeaf;          /* Maximum local payload in a LEAFDATA table */
  int minLeaf;          /* Minimum local payload in a LEAFDATA table */
  BusyHandler *pBusyHandler;   /* Callback for when there is lock contention */
  u8 inTransaction;     /* Transaction state */
  int nRef;             /* Number of references to this structure */
  int nTransaction;     /* Number of open transactions (read + write) */
  void *pSchema;        /* Pointer to space allocated by sqlite3BtreeSchema() */
  void (*xFreeSchema)(void*);  /* Destructor for BtShared.pSchema */
#ifndef SQLITE_OMIT_SHARED_CACHE
  BtLock *pLock;        /* List of locks held on this shared-btree struct */
  BtShared *pNext;      /* Next in ThreadData.pBtree linked list */
#endif
};

1:pPager

存儲Btree頁面緩存信息

2:pCursor

存儲Btree中打開的一系列游標

3:pPage1

存放數據庫文件的第一個頁面

4:maxEmbedFrac:

Btree內部頁中一個CELL最多能夠使用的空間。255意味着100%,默認值為0x40(25%),這保證了一個頁面至少包含4個CELL。

5:minEmbedFrac:

Btree內部頁中一個CELL使用空間的最小值。默認值為0x20(12.5%)

6:minLeafFrac:

Btree葉子頁中一個CELL使用空間的最小值。默認值為0x20(12.5%)

7:pageSize:

頁面大小指示位(字節單位)

8:pageSizeFixed

頁面大小能否改變指示位

9:autoVacuum:

數據庫是否支持autoVacuum指示位。

autoVacuum數據庫:當一個事務從數據庫中刪除了數據並提交后,數據庫文件的大小保持不變。即使整頁的數據都被刪除,該頁也會變成“空閑頁”等待再次被使用,而不會實際地被從數據庫文件中刪除。執行vacuum操作,可以通過重建數據庫文件來清除數據庫內所有的未用空間,使數據庫文件變小。但是,如果一個數據庫在創建時被指定為auto_vacuum數據庫,當刪除事務提交時,數據庫文件會自動縮小。使用auto_vacuum數據庫可以節省空間,但卻會增加數據庫操作的時間。

10:usableSize

指示每個頁面可用的字節數。一個頁面 尾部可能保留一部分空間作為擴展,實際可以使用的頁面字節數就是“頁面大小-保留空間”。

11:maxLocal\ minLocal\maxLeaf\minLeaf

頁面的一個CELL可以使用的最大。最小空間實際大小,通過下面公式可計算出來。

  pBt->maxLocal = (pBt->usableSize-12)*pBt->maxEmbedFrac/255 - 23;
  pBt->minLocal = (pBt->usableSize-12)*pBt->minEmbedFrac/255 - 23;
  pBt->maxLeaf = pBt->usableSize - 35;
  pBt->minLeaf = (pBt->usableSize-12)*pBt->minLeafFrac/255 - 23;

其中 12個字節為每個頁面頭的大小,23個字節為每個CELL內部的保存其它管理信息

  2-byte 保存CELL的地址
  4-byte 保存孩子節點的頁號
  9-byte 最多可以使用9個字節來保存Btree中的關鍵字值
  4-byte 保存4個字節的數據值
  4-byte 保存overflow 頁面號

我們可以看到23個字節是最大可能使用的管理空間,根據配置不同實際不會使用到23個字節。

12:pBusyHandler:

保存客戶端提供的數據庫忙的回調函數句柄,用於忙時的回調。

13:inTransaction

 存在TRANS_NONE\TRANS_READ\TRANS_WRITE三種狀態,由於可能存在多個用戶共享一個Btree結構,在TRANS_WRITE狀態下只能有一個用戶能夠進行寫事務。TRANS_READ 狀態下任意多個用戶能進行讀事務。

14:pLock

 一個表級鎖的鏈表

15:pNext

一個線程可能打開不同的數據庫,該結構表示該線程保存的一系列的Btree數據。


轉載請注明原始出處:http://www.cnblogs.com/chencheng/archive/2012/07/08/2581306.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM