_out.log 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. ============================================================
  2. TsDB2 B+ 树独立验证 (内存页存储, 不涉及真实 DB 文件)
  3. 页大小=16384 页头=32 填充因子=50% 分裂阈值=8192
  4. ============================================================
  5. ================ 主键 B+ 树 (BTreePKInsert / Search / Delete) ================
  6. [PASS] 插入 2500 个键
  7. --- 阶段1: 全量插入后 ---
  8. [info] root=3 叶子数=4 条目数=2500 层数=2 逻辑存活=2500
  9. [PASS] 查找存活键: 2500/2500 命中, 缺失 0
  10. [PASS] 查找值正确性: 值错误 0
  11. [PASS] 结构校验: 问题 0 条
  12. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=2500 逻辑=2500)
  13. [PASS] 删除偶数键 (1250 个)
  14. --- 阶段2: 删除偶数键后 ---
  15. [info] root=3 叶子数=2 条目数=1250 层数=2 逻辑存活=1250
  16. [PASS] 查找存活键: 1250/1250 命中, 缺失 0
  17. [PASS] 查找值正确性: 值错误 0
  18. [PASS] 已删除键不应被查到: 幽灵 0/1250
  19. [PASS] 结构校验: 问题 0 条
  20. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=1250 逻辑=1250)
  21. [PASS] 逆序删除剩余 1250 个键
  22. --- 阶段3: 全部删除后 ---
  23. [info] root=1 叶子数=1 条目数=0 层数=1 逻辑存活=0
  24. [PASS] 查找存活键: 0/0 命中, 缺失 0
  25. [PASS] 查找值正确性: 值错误 0
  26. [PASS] 已删除键不应被查到: 幽灵 0/2500
  27. [PASS] 结构校验: 问题 0 条
  28. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=0 逻辑=0)
  29. ================ 二级 B+ 树 (SBTInsert / SBTSearch / SBTDelete) ================
  30. [PASS] 插入 2500 个条目
  31. --- 阶段1: 全量插入后 ---
  32. [info] root=3 叶子数=9 条目数=2500 层数=2 逻辑存活=2500
  33. [PASS] 查找存活键: 2500/2500 命中, 缺失 0
  34. [PASS] 查找值正确性: 值错误 0
  35. [PASS] 结构校验: 问题 0 条
  36. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=2500 逻辑=2500)
  37. [PASS] 删除偶数键 (1250 个)
  38. --- 阶段2: 删除偶数键后 ---
  39. [info] root=3 叶子数=3 条目数=1250 层数=2 逻辑存活=1250
  40. [PASS] 查找存活键: 1250/1250 命中, 缺失 0
  41. [PASS] 查找值正确性: 值错误 0
  42. [PASS] 已删除键不应被查到: 幽灵 0/1250
  43. [PASS] 结构校验: 问题 0 条
  44. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=1250 逻辑=1250)
  45. [PASS] 逆序删除剩余 1250 个键
  46. --- 阶段3: 全部删除后 ---
  47. [info] root=1 叶子数=1 条目数=0 层数=1 逻辑存活=0
  48. [PASS] 查找存活键: 0/0 命中, 缺失 0
  49. [PASS] 查找值正确性: 值错误 0
  50. [PASS] 已删除键不应被查到: 幽灵 0/2500
  51. [PASS] 结构校验: 问题 0 条
  52. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=0 逻辑=0)
  53. ============ 二级 B+ 树 (keyLen=248, 强制内部节点分裂 => 3 层) ============
  54. [PASS] 插入 1500 个大键条目
  55. --- 阶段1: 大键全量插入后(应为 3 层) ---
  56. [info] root=34 叶子数=93 条目数=1500 层数=3 逻辑存活=1500
  57. [PASS] 查找存活键: 1500/1500 命中, 缺失 0
  58. [PASS] 查找值正确性: 值错误 0
  59. [PASS] 结构校验: 问题 0 条
  60. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=1500 逻辑=1500)
  61. ========= 二级 B+ 树: SBTBuildFromSorted 批量建树 ===========
  62. --- SBTBuildFromSorted 小键(2层) n=2000 ---
  63. [info] root=5 叶子数=4 条目数=2000 层数=2 逻辑存活=2000
  64. [PASS] 查找存活键: 2000/2000 命中, 缺失 0
  65. [PASS] 查找值正确性: 值错误 0
  66. [PASS] 结构校验: 问题 0 条
  67. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=2000 逻辑=2000)
  68. --- SBTBuildFromSorted 大键(3层) n=1500 ---
  69. [info] root=52 叶子数=49 条目数=1500 层数=3 逻辑存活=1500
  70. [PASS] 查找存活键: 1500/1500 命中, 缺失 0
  71. [PASS] 查找值正确性: 值错误 0
  72. [PASS] 结构校验: 问题 0 条
  73. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=1500 逻辑=1500)
  74. ========= 深层树验证 (强制 4 层以上, 验证深度可无限分裂) ==========
  75. [PASS] keyLen=1000 逐条插入 4000 条
  76. [PASS] keyLen=1000 插入后树高=6 (要求 >=4: 已突破 3 层)
  77. --- 深层树(keyLen=1000,n=4000) 全量校验 ---
  78. [info] root=683 叶子数=999 条目数=4000 层数=6 逻辑存活=4000
  79. [PASS] 查找存活键: 4000/4000 命中, 缺失 0
  80. [PASS] 查找值正确性: 值错误 0
  81. [PASS] 结构校验: 问题 0 条
  82. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=4000 逻辑=4000)
  83. [PASS] keyLen=1000 删除过程中(每500步采样)结构始终保持
  84. [PASS] keyLen=1000 逆序删除全部 4000 条
  85. --- 深层树(keyLen=1000) 删除全部后 ---
  86. [info] root=1 叶子数=1 条目数=0 层数=1 逻辑存活=0
  87. [PASS] 查找存活键: 0/0 命中, 缺失 0
  88. [PASS] 查找值正确性: 值错误 0
  89. [PASS] 已删除键不应被查到: 幽灵 0/4000
  90. [PASS] 结构校验: 问题 0 条
  91. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=0 逻辑=0)
  92. [PASS] keyLen=1000 批量建树树高=4 (要求 >=4)
  93. --- 深层批量建树(keyLen=1000,n=4000) ---
  94. [info] root=572 叶子数=500 条目数=4000 层数=4 逻辑存活=4000
  95. [PASS] 查找存活键: 4000/4000 命中, 缺失 0
  96. [PASS] 查找值正确性: 值错误 0
  97. [PASS] 结构校验: 问题 0 条
  98. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=4000 逻辑=4000)
  99. [PASS] keyLen=2000 逐条插入 1500 条
  100. [PASS] keyLen=2000 插入后树高=10 (要求 >=4: 已突破 3 层)
  101. --- 深层树(keyLen=2000,n=1500) 全量校验 ---
  102. [info] root=1023 叶子数=749 条目数=1500 层数=10 逻辑存活=1500
  103. [PASS] 查找存活键: 1500/1500 命中, 缺失 0
  104. [PASS] 查找值正确性: 值错误 0
  105. [PASS] 结构校验: 问题 0 条
  106. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=1500 逻辑=1500)
  107. [PASS] keyLen=2000 删除过程中(每187步采样)结构始终保持
  108. [PASS] keyLen=2000 逆序删除全部 1500 条
  109. --- 深层树(keyLen=2000) 删除全部后 ---
  110. [info] root=1 叶子数=1 条目数=0 层数=1 逻辑存活=0
  111. [PASS] 查找存活键: 0/0 命中, 缺失 0
  112. [PASS] 查找值正确性: 值错误 0
  113. [PASS] 已删除键不应被查到: 幽灵 0/1500
  114. [PASS] 结构校验: 问题 0 条
  115. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=0 逻辑=0)
  116. [PASS] keyLen=2000 批量建树树高=6 (要求 >=4)
  117. --- 深层批量建树(keyLen=2000,n=1500) ---
  118. [info] root=502 叶子数=375 条目数=1500 层数=6 逻辑存活=1500
  119. [PASS] 查找存活键: 1500/1500 命中, 缺失 0
  120. [PASS] 查找值正确性: 值错误 0
  121. [PASS] 结构校验: 问题 0 条
  122. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=1500 逻辑=1500)
  123. ========= 主键 B+ 树: 定向触发「从右兄弟借位」=========
  124. [info] 最左叶子 pid=1 含 680 个键
  125. [PASS] 主键树: 清空最左叶子 (680 个键, 失败 0)
  126. --- 清空最左叶子后 ---
  127. [info] root=3 叶子数=30 条目数=19320 层数=2 逻辑存活=19320
  128. [PASS] 查找存活键: 19320/19320 命中, 缺失 0
  129. [PASS] 查找值正确性: 值错误 0
  130. [PASS] 已删除键不应被查到: 幽灵 0/680
  131. [PASS] 结构校验: 问题 0 条
  132. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=19320 逻辑=19320)
  133. ========= 二级 B+ 树(大键,3层): 定向触发「从右兄弟借位」=========
  134. [info] 最左叶子 pid=1 含 16 个键
  135. [PASS] 二级树: 清空最左叶子 (16 个键, 失败 0)
  136. --- 清空最左叶子后 ---
  137. [info] root=34 叶子数=186 条目数=2984 层数=3 逻辑存活=2984
  138. [PASS] 查找存活键: 2984/2984 命中, 缺失 0
  139. [PASS] 查找值正确性: 值错误 0
  140. [PASS] 已删除键不应被查到: 幽灵 0/16
  141. [PASS] 结构校验: 问题 0 条
  142. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=2984 逻辑=2984)
  143. --- 随机压测 主键树 (keySpace=3000, 120 轮 x 200 次) ---
  144. [PASS] 主键树 阶段A: 乱序全量插入 3000 个键
  145. [PASS] 主键树 阶段B: 随机增删 120 轮, 累计异常 0
  146. --- 压测结束: 全量校验 ---
  147. [info] root=1 叶子数=1 条目数=675 层数=1 逻辑存活=675
  148. [PASS] 查找存活键: 675/675 命中, 缺失 0
  149. [PASS] 查找值正确性: 值错误 0
  150. [PASS] 已删除键不应被查到: 幽灵 0/2325
  151. [PASS] 结构校验: 问题 0 条
  152. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=675 逻辑=675)
  153. --- 随机压测 二级树(大键,3层) (keySpace=2000, 120 轮 x 120 次) ---
  154. [PASS] 二级树(大键,3层) 阶段A: 乱序全量插入 2000 个键
  155. [PASS] 二级树(大键,3层) 阶段B: 随机增删 120 轮, 累计异常 0
  156. --- 压测结束: 全量校验 ---
  157. [info] root=34 叶子数=24 条目数=485 层数=3 逻辑存活=485
  158. [PASS] 查找存活键: 485/485 命中, 缺失 0
  159. [PASS] 查找值正确性: 值错误 0
  160. [PASS] 已删除键不应被查到: 幽灵 0/1515
  161. [PASS] 结构校验: 问题 0 条
  162. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=485 逻辑=485)
  163. --- 随机压测 二级树(深,keyLen=1000) (keySpace=2500, 80 轮 x 150 次) ---
  164. [PASS] 二级树(深,keyLen=1000) 阶段A: 乱序全量插入 2500 个键
  165. [PASS] 二级树(深,keyLen=1000) 阶段B: 随机增删 80 轮, 累计异常 0
  166. --- 压测结束: 全量校验 ---
  167. [info] root=261 叶子数=107 条目数=569 层数=5 逻辑存活=569
  168. [PASS] 查找存活键: 569/569 命中, 缺失 0
  169. [PASS] 查找值正确性: 值错误 0
  170. [PASS] 已删除键不应被查到: 幽灵 0/1931
  171. [PASS] 结构校验: 问题 0 条
  172. [PASS] 叶子条目集合 == 逻辑存活集合 (叶子=569 逻辑=569)
  173. ============================================================
  174. 结论: 全部检查通过 (未发现 B+ 树问题)
  175. ============================================================