_out.log 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. ============================================================
  2. Hash 宽键索引测试 — 分裂阈值随桶页容量自适应
  3. ============================================================
  4. ========== 1. 插入 3000 行 (同表两个哈希索引, 仅键宽不同)
  5. [PASS] 插入 3000 行, Count=3000, 耗时 0.18s
  6. ========== 2. 分裂进度: 宽键已分裂, 窄键未分裂
  7. [info] idx_tag EntryPage=8 level=4 split=2 total=3000 keyLen=64 目录页=1
  8. [info] idx_grp EntryPage=11 level=4 split=0 total=3000 keyLen=8 目录页=1
  9. [PASS] idx_tag keyLen=64 → EntryLen=72 → 桶页容量=227 (期望 64/72/227)
  10. [PASS] idx_grp keyLen=8 → EntryLen=16 → 桶页容量=1022 (期望 8/16/1022)
  11. [PASS] idx_tag 分裂阈值=170 (min(400, 227*3/4)=170), 合并阈值=42
  12. [PASS] idx_grp 分裂阈值=400 (1022*3/4=766 > 400, 上限生效), 合并阈值=100
  13. [PASS] idx_tag 3000 行 → level=4 splitPointer=2 桶数=18 (期望 4/2/18)
  14. [PASS] idx_grp 3000 行 → level=4 splitPointer=0 桶数=16 (期望 4/0/16)
  15. [PASS] 两个索引活跃条目数均为 3000
  16. [PASS] idx_tag 桶目录页数=1 (18 个槽位应仍在一页内)
  17. [说明] 若阈值仍是固定 400: idx_tag 要 16*400=6400 行才分裂,
  18. 本次 3000 行时 splitPointer 会是 0 —— 上面那条断言即为回归护栏
  19. ========== 3. 宽键哈希索引正确性 (全量点查 / 分组计数 / 范围扫描)
  20. [PASS] 3000 个 64B 键全部点查命中且内容一致 (丢失 0)
  21. [PASS] 50 个 Grp 分组的计数全部 = 60
  22. [PASS] Grp 范围 [10,19] Count=600 (期望 600; 哈希不保序, 靠全桶扫描+键过滤)
  23. ========== 4. 删除 2500 行 → 桶合并收缩
  24. [PASS] 删除 2500 行 (失败 0), 剩余 Count=500
  25. [info] 删除后 idx_tag level=4 split=0 total=500 桶数=16
  26. [PASS] 删除后 idx_tag total=500 splitPointer=0 桶数=16 (期望 500/0/16)
  27. ========== 5. 关闭重开 (持久化)
  28. [PASS] 关库后磁盘上 idx_tag splitPointer=0 total=500, 与关库前一致
  29. [PASS] 重开后 idx_tag EntryPage=8 (关闭前 8)
  30. [PASS] 重开后 level=4 splitPointer=0 total=500 与关闭前一致
  31. [PASS] 重开后 Count=500 (期望 500)
  32. [PASS] 重开后 500 个存活行的宽键点查全部命中 (丢失 0)
  33. [PASS] 重开后已删除的 TAG00001 查不到
  34. ========== 测试总结
  35. 总计 20 项, 通过 20, 失败 0
  36. [OK] 宽键哈希索引工作正常, 分裂阈值确实随桶页容量收敛