sqlite Btree结构分析
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