2016-03-03 55 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_)中找到一些答案。 –