数据库文档官网:Oracle Berkeley DB

数据库访问方式 说明
Btree Btree访问方法是排序的平衡树结构的实现。树中的搜索,插入和删除都需要 O(height)时间,其中 height是Btree中从根到叶页面的层数。高度的上限是log base_b N,其中 base_b是页面上键的最小数目,而N是存储的键的总数。将无序数据插入Btree可能会导致页面仅占一半。DB使有序(或反向有序)插入是最好的情况,从而导致几乎全页空间利用率。
Hash 散列访问方法数据结构是扩展线性散列的实现,如“线性散列:用于文件和表寻址的新工具”
Heap 堆访问方法将记录存储在堆文件中。记录仅由写入它们的页面和偏移量引用。因为记录是写在堆文件中的,所以删除记录时不需要压缩,这比使用Btree可以更有效地利用空间。堆访问方法适用于磁盘空间受限的平台,尤其是在那些系统正在执行大量记录创建和删除操作的情况下。
Queue 队列访问方法存储具有逻辑记录号作为键的定长记录。它设计用于在尾部快速插入,并具有特殊的游标消耗操作,该操作从队列的开头删除并返回记录。队列访问方法使用记录级别锁定
Recno Recno访问方法以逻辑记录号作为键来存储固定长度和可变长度记录,并可选地由纯文本(字节流)文件支持。

访问方式的选择

最终,您只能通过使用两种访问方法的性能测试来确定哪种访问方法更适合您的应用程序。为了有效,此性能测试必须使用与生产相当的工作负载。
也就是说,在某些时候您绝对必须使用Btree:

  • 如果要使用批量放置和获取操作。

  • 如果使数据库按排序顺序群集对您很重要。

  • 如果您希望能够使用游标创建记录。

  • 如果您有多个线程/进程同时创建新记录,并且希望能够使用游标有效地遍历这些记录。

但是,除了这些限制之外,还有一些应用程序特征可能会导致您怀疑Heap对于您的应用程序比Btree更好。他们是:

  • 您的应用程序将在资源受限的环境中运行,并且您想对数据库文件的大小设置硬限制。

  • 您想限制数据库文件的磁盘空间增长,并且您的应用程序执行大约相等数量的记录创建和删除操作。

插入到Btree中需要将新记录排序到正确的页面上。此操作可能需要读取多个页面。堆数据库可以简单地重用它可以在缓存中找到的任何空白页空间。插入密集型应用程序通常会发现Heap比Btree效率高得多,尤其是随着数据库大小的增加。

在没有有关应用程序数据和数据访问模式的信息的情况下,对于小型数据集,Btree或Hash访问方法就足够了。对于大于缓存的数据集,通常建议使用Btree访问方法。如果您拥有真正的大数据,则哈希访问方法可能是一个更好的选择。该db_stat实用程序是监控你的缓存是如何执行的有用工具。

代码示例


            
            HashDatabaseConfig bTreeDatabaseConfig = new HashDatabaseConfig();
            //文件不存在则创建
            bTreeDatabaseConfig.Creation = CreatePolicy.IF_NEEDED;
            //页大小
            bTreeDatabaseConfig.PageSize = 512;
            //缓存大小
            bTreeDatabaseConfig.CacheSize = new CacheInfo(0, 64 * 1024, 1);
            //hash 类型的数据库
            HashDatabase bTreeDatabase = HashDatabase.Open("file.db", bTreeDatabaseConfig);
            string content = "HelloWorld";
            DatabaseEntry key = new DatabaseEntry(BitConverter.GetBytes(12));
            DatabaseEntry value = new DatabaseEntry(Encoding.ASCII.GetBytes(content));
            bTreeDatabase.Put(key, value);
            Console.WriteLine("写入成功");
            KeyValuePair<DatabaseEntry, DatabaseEntry> pair = bTreeDatabase.Get(key);
            Console.WriteLine("读取写入");
            Console.WriteLine(Encoding.ASCII.GetString(pair.Value.Data));
            bTreeDatabase.Close();

需要的类库下载 这里是dotnet的dll库,其他可以去官网下载,自行编译。

posted on 2020-03-26 22:42  好怀念啊  阅读(330)  评论(0编辑  收藏  举报