eeb*_*sen 6 database-internals berkeley-db
我使用 Berkeley DB (BDB) 作为 JMS 队列的持久存储。当我使用队列中的条目时,底层 BDB 文件不会立即缩小,但最终会缩小。我遇到了 BDB 文件在文件系统上占用大量空间而检索性能下降的问题。
我的条目大小变化很大,但在持久队列中有 400,000 条大约 32kb 的消息并不少见。
我想了解 BDB 如何管理文件,以便我可以限制文件大小/检索性能的条目数。或者我可以排除 BDB 作为我的持久存储机制。
我可能正在搜索错误的术语,但在Oracle 文档或The Berkeley DB Book 中没有找到我要查找的内容。如果 BDB 不想让我弄乱它的内部结构,我不会感到惊讶,但如果(至少)没有关于它如何处理其内部结构的概述,我会感到惊讶。
基本上,这个哲学似乎是,如果数据库会再次增长,那么就不值得花太多精力来压缩数据库。BDB 引擎的工作方式使得很难真正回收具有大量插入/更新活动的工作负载上的任何已释放空间,并且我认为 JMS 持久性很可能就是这样的工作负载。当然,这种理念的好处是,在出现大量新消息时,数据库不需要分配更多页面,而是可以以最有效的方式直接将数据写入现有页面。但是,如果对检索性能的影响很大,则 BDB 可能确实不是您工作负载的正确选择。
我想知道 Oracle 论坛中这些帖子中提供的答案是否能解开这个谜团(引用来自第二个链接)。
在开始页面重用之前,数据库必须达到没有特定的最大大小。此外,您不需要关闭并重新打开数据库句柄来影响页面重用。BDB 在页面清空时重用页面,并且不执行任何类型的自动键/页面平衡(因为这会导致死锁)。您应该考虑的因素是插入、更新和删除率、事务是否长期存在、死锁检测策略、数据库页面大小和页面填充因子等。
一个可以解释您所看到的行为的示例是,当尝试删除该页面上找到的键时,删除进程/线程“迟到”到该页面。当它获取该页上的写锁时,那里不再有连续的键,并且删除进程/线程最多只能删除这些键的一部分(其他键是具有更高值的键,因为插入并且更新进程/线程遥遥领先),因此页面不会被清空,以便可以将其放入空闲列表中以供重用。如果插入和更新过程非常活跃,这可能会导致快速页面拆分(或新页面分配),因此键集会被移动到新页面上。此外,插入的新键可能会落在已经填充的页面上,从而使删除过程变得更加困难。如果插入的新键可以根据它们的值分配到已填充的有空间的页面,则空闲列表上的页面(如果有)将不会被重用。
归档时间: |
|
查看次数: |
1819 次 |
最近记录: |