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

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