2016-03-03 46 views
1

我使用db_stat获得在BDB记录大致数量(以避免在整个数据库迭代):是否有可能得到平均Berkeley DB的记录大小

[[email protected] 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字节(文件大小一致),并得到近似的记录大小2340分之2633728= 1125

所以我的问题 - 将使用来自db_stat信息的其他信息给我更准确的结果?

回答

1

你计算的平均记录大小的上限

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

你可以通过减去所有的“字节的页面XXX免费”从总更接近真理。这是数据库未使用的空间,因为它的填充方式效率低下。 (顺便说一句,这看起来不错,但是每当有大量的溢出页面时,你可以考虑一个更大的页面大小。当然,对于较大的页面大小也有不利影响。Yay,数据库!)

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得到。它包括每个记录的支持数据库结构以及其他数据库开销。

+0

谢谢,这是有道理的。有没有关于它的文档? –

+0

我找不到任何具体描述你要找的东西。通常可以处理各种类型溢出页面的概念以及数据库中页面的使用方式。因此,您可能会在数据库教科书(如Gray和Reuter的_Transaction Processing_)中找到一些答案。 –