是否有可能获得Berkeley DB的平均记录大小

时间:2016-03-03 13:55:39

标签: berkeley-db

我使用db_stat获取BDB中的大致记录数(以避免遍历整个数据库):

[me@home magic]$ db_stat -d random.db
Thu Mar  3 13:38:25 2016        Local time
61561   Hash magic number
8       Hash version number
Little-endian   Byte order
        Flags
643     Number of pages in the database
4096    Underlying database page size
0       Specified fill factor
2340    Number of keys in the database
2340    Number of data items in the database
299     Number of hash buckets
303540  Number of bytes free on bucket pages (75% ff)
15      Number of overflow pages
39282   Number of bytes free in overflow pages (36% ff)
114     Number of bucket overflow pages
322730  Number of bytes free in bucket overflow pages (30% ff)
0       Number of duplicate pages
0       Number of bytes free in duplicate pages (0% ff)
1       Number of pages on the free list

是否有可能获得平均记录大小?

我想我可以使用以下信息来获得整体尺寸:

643     Number of pages in the database
4096    Underlying database page size

643 * 4096 = 2633728字节(对应文件大小)并得到近似记录大小2633728/2340 = 1125

所以我的问题 - 使用db_stat信息中的其他信息会给我更准确的结果吗?

1 个答案:

答案 0 :(得分:1)

您已经计算了平均记录大小的上限

643 pages * 4096 bytes / page = 2633728 bytes total
2633728 bytes / 2340 keys (records) = 1126 bytes / record

你可以通过在XXX页面上减去所有"免费字节来接近真相"从总数。这是数据库未使用的空间,因为它的填充方式效率低下。 (顺便说一句,这看起来并不太糟糕,但每当有大量的溢出页面时,你可以考虑更大的页面大小。当然,也有更大页面大小的缺点。是的,数据库! )

 2633728 bytes 
- 303540 bytes free on bucket pages
-  39282 bytes free in overflow pages
- 322730 bytes free in bucket overflow pages
-      0 bytes free in duplicate pages
--------
 1968176 bytes total / 2340 keys = 841 bytes / record

这个数字仍然不是平均记录大小,但我认为它与db_stat的距离非常接近。它包括每个记录的支持数据库结构和其他数据库开销。