数据库文件组织结构

dbHeader(4096).......

| index(默认512*1024) ....... | shadowIndex(默认512*1024) ........

| bitmap page (默认计算出来是9个,4*4096,占用的置1,表示已占用).........

| page(4096) | page(4096) | ............

 

fastdb只有一个数据文件,所有数据库信息全存在里面,默认的数据文件是8M

 

 

dbHeader 的结构如下,主要存储全局的数据库信息,

class dbHeader {
public:
    offs_t size; // database file size
    int4   curr; // current root
    int4   dirty; // database was not closed normally
    int4   initialized; // database is initilaized
#if (dbDatabaseOffsetBits > 32 && defined(ALIGN_HEADER)) || defined(PAD_HEADER)
    int4   pad;
#endif
    struct {
        offs_t index;           // offset to object index
        offs_t shadowIndex;     // offset to shadow index
        oid_t indexSize;       // size of object index
        oid_t shadowIndexSize; // size of object index
        oid_t indexUsed;       // used part of the index  
        oid_t freeList;        // L1 list of free descriptors
    } root[2];
   
    int4 majorVersion;
    int4 minorVersion;
    int4 mode;

    enum {
        MODE_OID_64        = 0x01,
        MODE_OFFS_64       = 0x02,
        MODE_AUTOINCREMENT = 0x04,
        MODE_RECTANGLE_DIM = 0x08
    };   

    int getVersion() {
        return majorVersion*100 + minorVersion;
    }
   
    bool isCompatible();
    static int getCurrentMode();
};

 

index 和 shadowIndex 非常重要,它就是影子算法的实现部分,也就是自带文档里面的object index

当事务提交后,会把index中的内容拷贝到shadowIndex 里面,这样它们的内容就一致了

每个对象,包括表或者列,全有一个全局的oid,这个oid是不重复的,通过oid就能找到对应的对象在数据文件中的偏移地址,这个地址就存储在index 和 shadowIndex 里面,

oid的起始从0开始,在32的系统中,有8192个bitmap的页面,所以可用的从8194开始,如下面的定义:

 

 

enum dbPredefinedIds {
    dbInvalidId,
    dbMetaTableId,
    dbBitmapId,
    dbFirstUserId = dbBitmapId + dbBitmapPages
};

index 和 shadowIndex 的初始位置是这样的,当增大时,一般是增大一倍,并移动到别的地方,原空间释放

 

bitmap page 表示的是前面已使用的存储空间,这就是已使用的dbHeader,index,shadowIndex 的总和

 

 

这之后就是一个一个连续的普通page了,bitmap页面的分配都是以4096为单位的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值