full_run.log 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. ========================================================================================================
  2. P0 环境与参数
  3. ========================================================================================================
  4. 时间 : 2026-09-12 09:32:50
  5. Go : go1.25.0 | CPU 32 核 (GOMAXPROCS=32) | windows/amd64
  6. 规模 : 主表 10000000 行 | 订单 1000000 行 | 部门 100 行 | 单行更新 2000 次 | 逐行删除 100000 行
  7. 参数 : Age=20+No%50 | Score=No%1000 | Dept=Dept(No%100) | Salary=No%100000
  8. 索引 : pk_emp + idx_emp_no/BTree + idx_emp_age/BTree + idx_emp_dept/BTree
  9. 提交策略 : preset=batch(脏页阈值 500 页), 自动提交防抖禁用, 每 100 万行显式 Commit
  10. 主库 : D:\GOPATH\src\TsDB2\demo\bench_10m\bench_10m.db
  11. 探针库 : D:\GOPATH\src\TsDB2\demo\bench_10m\bench_10m_probe.db
  12. GoAlloc=0MB Sys=6MB HeapInuse=1MB NumGC=0
  13. 清理同前缀旧库文件...
  14. [清理旧库] D:\GOPATH\src\TsDB2\demo\bench_10m\bench_10m.db
  15. [清理旧库] D:\GOPATH\src\TsDB2\demo\bench_10m\bench_10m_probe.db
  16. ========================================================================================================
  17. P1 建表 / 打开表 + 索引
  18. ========================================================================================================
  19. UseTable × 3 (含建表/建索引) 行数=3 耗时=1ms 5.82k/s
  20. emp 活跃列 : [_id No Name Age Score Dept Salary Active]
  21. emp 字段数 : 总 8 / 活跃 8 | TotalRows=0
  22. 索引 pk_emp type=2 分量=1 fieldIDs=[0]
  23. 索引 idx_emp_no type=5 分量=1 fieldIDs=[1]
  24. 索引 idx_emp_age type=5 分量=1 fieldIDs=[3]
  25. 索引 idx_emp_dept type=5 分量=1 fieldIDs=[5]
  26. ========================================================================================================
  27. P2 千万级写入: 单行 Insert × 10000000 (含进度 / 分档 Commit)
  28. ========================================================================================================
  29. [ 200000 行] 累计 10.4s | 瞬时 19.29k/s | 磁盘 58.9MB | ETA 8m28s | GoAlloc=5MB Sys=86MB HeapInuse=6MB NumGC=11710
  30. [ 400000 行] 累计 21.3s | 瞬时 18.28k/s | 磁盘 111.6MB | ETA 8m45s | GoAlloc=6MB Sys=86MB HeapInuse=6MB NumGC=22956
  31. [ 600000 行] 累计 33.8s | 瞬时 15.99k/s | 磁盘 163.5MB | ETA 9m48s | GoAlloc=5MB Sys=86MB HeapInuse=6MB NumGC=34645
  32. [ 800000 行] 累计 46.9s | 瞬时 15.27k/s | 磁盘 215.1MB | ETA 10m3s | GoAlloc=8MB Sys=86MB HeapInuse=8MB NumGC=47010
  33. [ 1000000 行] 累计 60.2s | 瞬时 15.03k/s | 磁盘 265.6MB | ETA 9m59s | GoAlloc=15MB Sys=86MB HeapInuse=15MB NumGC=59128
  34. [ 1000000 行] 显式 Commit 79ms | 磁盘 269.1MB
  35. [ 1200000 行] 累计 73.5s | 瞬时 15.04k/s | 磁盘 319.7MB | ETA 9m45s | GoAlloc=11MB Sys=86MB HeapInuse=12MB NumGC=71768
  36. [ 1400000 行] 累计 86.9s | 瞬时 14.93k/s | 磁盘 373.2MB | ETA 9m36s | GoAlloc=9MB Sys=90MB HeapInuse=9MB NumGC=84496
  37. [ 1600000 行] 累计 100.5s | 瞬时 14.76k/s | 磁盘 425.2MB | ETA 9m29s | GoAlloc=14MB Sys=90MB HeapInuse=14MB NumGC=96795
  38. [ 1800000 行] 累计 113.9s | 瞬时 14.83k/s | 磁盘 480.1MB | ETA 9m13s | GoAlloc=6MB Sys=90MB HeapInuse=6MB NumGC=109201
  39. [ 2000000 行] 累计 128.5s | 瞬时 13.73k/s | 磁盘 532.2MB | ETA 9m43s | GoAlloc=7MB Sys=90MB HeapInuse=7MB NumGC=122215
  40. [ 2000000 行] 显式 Commit 27ms | 磁盘 532.2MB
  41. [ 2200000 行] 累计 143.8s | 瞬时 13.06k/s | 磁盘 583.9MB | ETA 9m57s | GoAlloc=10MB Sys=90MB HeapInuse=11MB NumGC=135859
  42. [ 2400000 行] 累计 159.1s | 瞬时 13.08k/s | 磁盘 634.8MB | ETA 9m41s | GoAlloc=8MB Sys=90MB HeapInuse=9MB NumGC=148892
  43. [ 2600000 行] 累计 174.5s | 瞬时 13.01k/s | 磁盘 688.7MB | ETA 9m29s | GoAlloc=7MB Sys=90MB HeapInuse=8MB NumGC=162195
  44. [ 2800000 行] 累计 189.7s | 瞬时 13.14k/s | 磁盘 742.3MB | ETA 9m8s | GoAlloc=7MB Sys=90MB HeapInuse=8MB NumGC=175136
  45. [ 3000000 行] 累计 205.8s | 瞬时 12.45k/s | 磁盘 793.9MB | ETA 9m22s | GoAlloc=9MB Sys=90MB HeapInuse=9MB NumGC=188749
  46. [ 3000000 行] 显式 Commit 49ms | 磁盘 793.9MB
  47. [ 3200000 行] 累计 221.9s | 瞬时 12.38k/s | 磁盘 847.1MB | ETA 9m9s | GoAlloc=6MB Sys=90MB HeapInuse=6MB NumGC=202490
  48. [ 3400000 行] 累计 237.9s | 瞬时 12.52k/s | 磁盘 898.4MB | ETA 8m47s | GoAlloc=11MB Sys=90MB HeapInuse=12MB NumGC=216199
  49. [ 3600000 行] 累计 253.6s | 瞬时 12.70k/s | 磁盘 950.4MB | ETA 8m24s | GoAlloc=10MB Sys=90MB HeapInuse=10MB NumGC=229538
  50. [ 3800000 行] 累计 269.5s | 瞬时 12.64k/s | 磁盘 1004.9MB | ETA 8m11s | GoAlloc=8MB Sys=90MB HeapInuse=8MB NumGC=243133
  51. [ 4000000 行] 累计 285.5s | 瞬时 12.49k/s | 磁盘 1056.2MB | ETA 8m1s | GoAlloc=8MB Sys=90MB HeapInuse=9MB NumGC=256681
  52. [ 4000000 行] 显式 Commit 50ms | 磁盘 1056.2MB
  53. [ 4200000 行] 累计 301.6s | 瞬时 12.42k/s | 磁盘 1109.3MB | ETA 7m47s | GoAlloc=9MB Sys=90MB HeapInuse=10MB NumGC=270225
  54. [ 4400000 行] 累计 317.7s | 瞬时 12.42k/s | 磁盘 1163.4MB | ETA 7m31s | GoAlloc=6MB Sys=90MB HeapInuse=7MB NumGC=283648
  55. [ 4600000 行] 累计 334.0s | 瞬时 12.24k/s | 磁盘 1213.9MB | ETA 7m21s | GoAlloc=7MB Sys=90MB HeapInuse=7MB NumGC=297339
  56. [ 4800000 行] 累计 350.5s | 瞬时 12.17k/s | 磁盘 1267.3MB | ETA 7m7s | GoAlloc=9MB Sys=90MB HeapInuse=9MB NumGC=310890
  57. [ 5000000 行] 累计 366.8s | 瞬时 12.21k/s | 磁盘 1319.8MB | ETA 6m49s | GoAlloc=10MB Sys=90MB HeapInuse=11MB NumGC=324652
  58. [ 5000000 行] 显式 Commit 65ms | 磁盘 1319.8MB
  59. [ 5200000 行] 累计 383.3s | 瞬时 12.11k/s | 磁盘 1373.2MB | ETA 6m36s | GoAlloc=6MB Sys=90MB HeapInuse=7MB NumGC=338351
  60. [ 5400000 行] 累计 399.7s | 瞬时 12.25k/s | 磁盘 1425.2MB | ETA 6m15s | GoAlloc=9MB Sys=90MB HeapInuse=9MB NumGC=351926
  61. [ 5600000 行] 累计 415.9s | 瞬时 12.33k/s | 磁盘 1477.2MB | ETA 5m57s | GoAlloc=11MB Sys=90MB HeapInuse=12MB NumGC=365705
  62. [ 5800000 行] 累计 432.2s | 瞬时 12.28k/s | 磁盘 1529.6MB | ETA 5m42s | GoAlloc=12MB Sys=90MB HeapInuse=13MB NumGC=379200
  63. [ 6000000 行] 累计 449.0s | 瞬时 11.86k/s | 磁盘 1581.5MB | ETA 5m37s | GoAlloc=7MB Sys=90MB HeapInuse=8MB NumGC=393030
  64. [ 6000000 行] 显式 Commit 51ms | 磁盘 1581.5MB
  65. [ 6200000 行] 累计 465.6s | 瞬时 12.06k/s | 磁盘 1635.5MB | ETA 5m15s | GoAlloc=7MB Sys=90MB HeapInuse=7MB NumGC=406746
  66. [ 6400000 行] 累计 482.1s | 瞬时 12.15k/s | 磁盘 1687.2MB | ETA 4m56s | GoAlloc=7MB Sys=90MB HeapInuse=8MB NumGC=420353
  67. [ 6600000 行] 累计 498.7s | 瞬时 12.05k/s | 磁盘 1739.4MB | ETA 4m42s | GoAlloc=12MB Sys=90MB HeapInuse=12MB NumGC=434041
  68. [ 6800000 行] 累计 515.1s | 瞬时 12.14k/s | 磁盘 1791.8MB | ETA 4m24s | GoAlloc=11MB Sys=90MB HeapInuse=11MB NumGC=447548
  69. [ 7000000 行] 累计 531.5s | 瞬时 12.24k/s | 磁盘 1844.0MB | ETA 4m5s | GoAlloc=9MB Sys=90MB HeapInuse=9MB NumGC=461334
  70. [ 7000000 行] 显式 Commit 63ms | 磁盘 1845.5MB
  71. [ 7200000 行] 累计 547.9s | 瞬时 12.17k/s | 磁盘 1898.6MB | ETA 3m50s | GoAlloc=6MB Sys=90MB HeapInuse=6MB NumGC=474942
  72. [ 7400000 行] 累计 564.4s | 瞬时 12.12k/s | 磁盘 1950.2MB | ETA 3m34s | GoAlloc=9MB Sys=90MB HeapInuse=10MB NumGC=488730
  73. [ 7600000 行] 累计 581.0s | 瞬时 12.08k/s | 磁盘 2002.2MB | ETA 3m19s | GoAlloc=7MB Sys=90MB HeapInuse=7MB NumGC=502373
  74. [ 7800000 行] 累计 597.4s | 瞬时 12.14k/s | 磁盘 2057.0MB | ETA 3m1s | GoAlloc=6MB Sys=90MB HeapInuse=6MB NumGC=515629
  75. [ 8000000 行] 累计 614.2s | 瞬时 11.95k/s | 磁盘 2109.2MB | ETA 2m47s | GoAlloc=7MB Sys=90MB HeapInuse=7MB NumGC=529554
  76. [ 8000000 行] 显式 Commit 19ms | 磁盘 2109.2MB
  77. [ 8200000 行] 累计 630.6s | 瞬时 12.19k/s | 磁盘 2158.0MB | ETA 2m28s | GoAlloc=13MB Sys=90MB HeapInuse=13MB NumGC=542776
  78. [ 8400000 行] 累计 647.5s | 瞬时 11.82k/s | 磁盘 2213.4MB | ETA 2m15s | GoAlloc=5MB Sys=90MB HeapInuse=6MB NumGC=556681
  79. [ 8600000 行] 累计 663.8s | 瞬时 12.31k/s | 磁盘 2265.1MB | ETA 1m54s | GoAlloc=6MB Sys=90MB HeapInuse=7MB NumGC=570060
  80. [ 8800000 行] 累计 680.4s | 瞬时 12.01k/s | 磁盘 2319.2MB | ETA 1m40s | GoAlloc=5MB Sys=90MB HeapInuse=6MB NumGC=583436
  81. [ 9000000 行] 累计 697.1s | 瞬时 12.00k/s | 磁盘 2373.4MB | ETA 1m23s | GoAlloc=5MB Sys=90MB HeapInuse=6MB NumGC=597255
  82. [ 9000000 行] 显式 Commit 25ms | 磁盘 2373.4MB
  83. [ 9200000 行] 累计 714.0s | 瞬时 11.82k/s | 磁盘 2425.0MB | ETA 1m8s | GoAlloc=3MB Sys=90MB HeapInuse=4MB NumGC=611000
  84. [ 9400000 行] 累计 731.2s | 瞬时 11.65k/s | 磁盘 2475.5MB | ETA 51s | GoAlloc=7MB Sys=90MB HeapInuse=7MB NumGC=625176
  85. [ 9600000 行] 累计 748.3s | 瞬时 11.65k/s | 磁盘 2530.0MB | ETA 34s | GoAlloc=5MB Sys=90MB HeapInuse=6MB NumGC=638962
  86. [ 9800000 行] 累计 765.2s | 瞬时 11.88k/s | 磁盘 2581.1MB | ETA 17s | GoAlloc=13MB Sys=90MB HeapInuse=14MB NumGC=652797
  87. [ 10000000 行] 累计 781.7s | 瞬时 12.10k/s | 磁盘 2635.1MB | ETA 0s | GoAlloc=10MB Sys=90MB HeapInuse=10MB NumGC=666043
  88. [ 10000000 行] 显式 Commit 58ms | 磁盘 2635.1MB
  89. 单行 Insert × 10000000 + 分档 Commit 行数=10000000 耗时=13m1.762s 12.79k/s
  90. 最终 Commit 1ms | 磁盘 2635.1MB | 文件 2.57GB | GoAlloc=19MB Sys=90MB HeapInuse=19MB NumGC=666046
  91. 全表扫描 写入后全量校验(插入态) 行数=10000000 耗时=22.179s 450.88k/s
  92. ========================================================================================================
  93. P3 查询性能 (主键点查 / 二级索引等值 / 范围 / 分页 / 排序 / 投影 / 聚合)
  94. ========================================================================================================
  95. 主键点查 Find(pkID) × 20000 行数=20000 耗时=649ms 30.84k/s
  96. 二级索引等值 Where(No=..) × 20000 行数=20000 耗时=1.79s 11.18k/s
  97. 索引等值 Count(Age=..) × 20 (每次 200000 行) 行数=4000000 耗时=26.82s 149.14k/s
  98. 索引范围 Count(Age 30..34, 1000000 行) 行数=1000000 耗时=6.43s 155.52k/s
  99. 字符串索引 Count(Dept=Dept007, 100000 行) 行数=100000 耗时=803ms 124.61k/s
  100. 无索引条件 Count(Score=123, 10000 行) 全表扫描 行数=10000000 耗时=2.021s 4.95M/s
  101. Limit(10).Offset(500) 行数=10 耗时=19ms 526/s
  102. OrderBy(索引列 Age) + Limit(10) 流式取前 N 行数=10 耗时=61ms 165/s
  103. OrderBy(非索引列 Score) 100000 行参与内存排序 行数=100000 耗时=1.02s 98.03k/s
  104. Select(No,Age) 首行返回: No=1 Age=21
  105. Sum(Salary) 全表 行数=10000000 耗时=7.971s 1.25M/s
  106. Max(No) 行数=10000000 耗时=7.702s 1.30M/s
  107. ========================================================================================================
  108. P4 多表: 部门维度表 + 订单表 + 索引关联计数校验
  109. ========================================================================================================
  110. 维度表 dept_dim 写入 100 行 行数=100 耗时=6ms 18.14k/s
  111. [订单 200000 行] 累计 7.3s | 27.44k/s | 磁盘 2659.2MB
  112. [订单 400000 行] 累计 15.0s | 26.67k/s | 磁盘 2677.1MB
  113. [订单 600000 行] 累计 22.6s | 26.52k/s | 磁盘 2701.4MB
  114. [订单 800000 行] 累计 32.3s | 24.77k/s | 磁盘 2727.5MB
  115. [订单 1000000 行] 累计 43.2s | 23.14k/s | 磁盘 2749.7MB
  116. 订单表 orders 写入 1000000 行 行数=1000000 耗时=43.286s 23.10k/s
  117. 关联计数: 订单表按 EmpNo 索引 × 20 行数=20 耗时=48ms 415/s
  118. 关联计数: 员工表按 Dept 索引 × 100 (每次 100000 行) 行数=10000000 耗时=1m33.312s 107.17k/s
  119. ========================================================================================================
  120. P5 更新 (单行整行重写 / core 批量更新 / 索引列更新后索引是否同步)
  121. ========================================================================================================
  122. 单行更新 Update(整行重写) × 2000 行数=2000 耗时=149ms 13.44k/s
  123. core 批量更新 Updater.Exec (Score=500 → Age=99) 行数=10000 耗时=29.693s 337/s
  124. 索引列更新后 Count(Age=99) 行数=10000 耗时=118ms 84.99k/s
  125. core 批量更新字符串索引列 (Score=321 → Dept=Dept099) 行数=10000 耗时=38.184s 262/s
  126. ========================================================================================================
  127. P6 删除 (逐行删 100000 行 / 批量删除全表重建) + 全量一致性校验
  128. ========================================================================================================
  129. 逐行 Delete(pkID) × 100000 行数=100000 耗时=26.558s 3.77k/s
  130. 批量删除 orders (Status=0, 200000 行) 触发全表重建 行数=200000 耗时=5.95s 33.61k/s
  131. 批量删除后 员工→订单 关联计数 × 20 行数=20 耗时=1ms 14.00k/s
  132. --- 6.3 一致性校验 (更新 + 删除之后, 期望值由公式推导) ---
  133. 全表扫描 删除后全量校验(公式) 行数=9900000 耗时=24.326s 406.97k/s
  134. 索引计数复核 Dept × 100 行数=9900000 耗时=1m38.679s 100.33k/s
  135. ========================================================================================================
  136. P7 Schema 变更: 增列 / 删列 / 改列名 (含数据正确性校验)
  137. ========================================================================================================
  138. --- 7.0 变更前基线 ---
  139. 活跃列: [_id No Name Age Score Dept Salary Active]
  140. TotalRows=9900000 | 字段数 总8/活跃8
  141. 基线行 No=3333333 → _id=3333333 No=3333333 Name=Emp03333333 Age=53 Score=333 Dept=Dept033 Salary=33333 Active=0
  142. --- 7.1 ADD COLUMN Level (8 字节新列) ---
  143. --- 7.2 在新增列上建索引 ---
  144. 新增列索引 Count(Level=777) 行数=3 耗时=1ms 3.00k/s
  145. --- 7.3 DROP COLUMN Level (先 DropIndex 再 DropField) ---
  146. --- 7.4 改列名 (引擎无 RENAME API, 只能 DROP 旧列 + ADD 新列) ---
  147. 证据: 老行 Dept 原值="Dept033", 改名后既读不到 Dept 也读不到 DeptName
  148. [设计约束] 引擎没有 RENAME COLUMN / RENAME TABLE API: 改列名只能 DROP 旧列 + ADD 新列; 老行原值不会被迁移到新列名(数据仍在行内, 只是列名不可达), 需要业务侧自行回填
  149. --- 7.5 重新加回同名 Dept 列 (DropField 实为软删除) ---
  150. [重要语义] DROP COLUMN 是软删除, 数据仍留在行内; 重新 ADD 同名列会"复活"老行数据: 这解释了为什么改列名(删+加新名)后数据看似丢失, 但加回旧列名后又能读到 → 敏感数据无法靠删列来清除, 需要重建表/覆写
  151. --- 7.6 重建 Dept 索引 + core 层全表校验 ---
  152. 重建索引后 索引计数复核 Dept × 100 行数=9900003 耗时=1m36.198s 102.91k/s
  153. core 全表扫描 P7 变更后全量校验 行数=9900003 耗时=18.938s 522.75k/s
  154. [已关库] 磁盘 2776.7MB | GoAlloc=23MB Sys=1596MB HeapInuse=24MB NumGC=888919
  155. ========================================================================================================
  156. P8 引擎语义探针 (独立库 bench_10m_probe.db, 不影响主库)
  157. ========================================================================================================
  158. --- T1 core 建表(无 _id 列) 时, Delete/Update 如何确定 pkID ---
  159. 表 = [No(8B), Label(32B)], 无 _id 列; 引擎反序列化出的行: No=5 Label=L1
  160. 数据: pkID 1→No5, 2→No5, 3→No5, 4→No6, 5→No7
  161. Delete(No==5) → cnt=3 err=<nil> | 剩余: pkID4(No=6) pkID5(No=7) | TotalRows=2
  162. Update(No==6 → Label=X) → cnt=1 err=<nil>
  163. 对照: ORM 表的行首列是 _id(=pkID), 因此 ORM 路径不受影响; 纯 core 表需自行保证首列语义
  164. --- T2 只删列不删索引: 残留索引的行为 ---
  165. 删列前 Count(Tag==20)=1 err=<nil>
  166. 删列后活跃列=[No]
  167. 残留索引 idx_probe_tag 仍存在=true
  168. 删列后按残留索引查询 Tag==20 → err=<nil>
  169. 删列后插入不含 Tag 的新行 → err=<nil> TotalRows=6
  170. 读回新行: No=6 err=<nil>
  171. --- T3 ORM 显式指定 _id ≠ 引擎 pkID ---
  172. Insert(ID=999999) → err=<nil>, 对象 ID=999999
  173. Find(999999) → err=<nil>
  174. Find(1) → err=key not found
  175. --- T4 删除中间 pkID 后再插入: pkID 复用与碰撞 ---
  176. 插 3 行(pkID 1,2,3) → 删 pkID=2 → Count=2 TotalRows=2
  177. 再插 1 行(No=99) 后存活: {_id=1,No=1} {_id=3,No=3} {_id=4,No=99} | Count=3 TotalRows=3
  178. --- T5 float64 列的小数精度 ---
  179. 写入 Salary=123.75 → 读回 123.75
  180. ========================================================================================================
  181. P9 关库重开: 持久化 / schema / 索引 校验
  182. ========================================================================================================
  183. 重开后 emp 活跃列: [_id No Name Age Score Salary Active DeptName Dept]
  184. TotalRows=9900003 (期望 9900003) | 磁盘 2777.3MB
  185. core 全表扫描 重开后 core 全量校验 行数=9900003 耗时=19.512s 507.39k/s
  186. --- 9.2 ORM 重开表 (UseTable 会按 struct 同步 schema) ---
  187. UseTable[Emp] 之后活跃列: [_id No Name Age Score Salary Active Dept]
  188. [风险] ORM 重开表会按 struct 强制同步 schema, 静默删除 struct 里没有的列: 纯 core 视角活跃列=[_id No Name Age Score Salary Active DeptName Dept] 含 DeptName, 调用 UseTable[Emp] 后活跃列=[_id No Name Age Score Salary Active Dept], DeptName 被自动 DropField; 手工加过列的表被 ORM 打开就会"丢列"(数据仍在行内, 再加回同名列可复活)
  189. 全表扫描 重开后 ORM 全量校验 行数=9900003 耗时=25.025s 395.60k/s
  190. ========================================================================================================
  191. P10 汇总报告
  192. ========================================================================================================
  193. 【性能总表】共 32 项
  194. 阶段 操作 行数 耗时 速率
  195. ------------------------------------------------------------------------------------------------------------
  196. P1 建表 UseTable × 3 (含建表/建索引) 3 1ms 5.82k/s
  197. P2 写入 单行 Insert × 10000000 + 分档 Commit 10000000 13m1.762s 12.79k/s
  198. 校验 全表扫描 写入后全量校验(插入态) 10000000 22.179s 450.88k/s
  199. P3 查询 主键点查 Find(pkID) × 20000 20000 649ms 30.84k/s
  200. P3 查询 二级索引等值 Where(No=..) × 20000 20000 1.79s 11.18k/s
  201. P3 查询 索引等值 Count(Age=..) × 20 (每次 200000 行) 4000000 26.82s 149.14k/s
  202. P3 查询 索引范围 Count(Age 30..34, 1000000 行) 1000000 6.43s 155.52k/s
  203. P3 查询 字符串索引 Count(Dept=Dept007, 100000 行) 100000 803ms 124.61k/s
  204. P3 查询 无索引条件 Count(Score=123, 10000 行) 全表扫描 10000000 2.021s 4.95M/s
  205. P3 查询 Limit(10).Offset(500) 10 19ms 526/s
  206. P3 查询 OrderBy(索引列 Age) + Limit(10) 流式取前 N 10 61ms 165/s
  207. P3 查询 OrderBy(非索引列 Score) 100000 行参与内存排序 100000 1.02s 98.03k/s
  208. P3 聚合 Sum(Salary) 全表 10000000 7.971s 1.25M/s
  209. P3 聚合 Max(No) 10000000 7.702s 1.30M/s
  210. P4 多表 维度表 dept_dim 写入 100 行 100 6ms 18.14k/s
  211. P4 多表 订单表 orders 写入 1000000 行 1000000 43.286s 23.10k/s
  212. P4 多表 关联计数: 订单表按 EmpNo 索引 × 20 20 48ms 415/s
  213. P4 多表 关联计数: 员工表按 Dept 索引 × 100 (每次 100000 行) 10000000 1m33.312s 107.17k/s
  214. P5 更新 单行更新 Update(整行重写) × 2000 2000 149ms 13.44k/s
  215. P5 更新 core 批量更新 Updater.Exec (Score=500 → Age=99) 10000 29.693s 337/s
  216. P5 校验 索引列更新后 Count(Age=99) 10000 118ms 84.99k/s
  217. P5 更新 core 批量更新字符串索引列 (Score=321 → Dept=Dept099) 10000 38.184s 262/s
  218. P6 删除 逐行 Delete(pkID) × 100000 100000 26.558s 3.77k/s
  219. P6 删除 批量删除 orders (Status=0, 200000 行) 触发全表重建 200000 5.95s 33.61k/s
  220. P6 校验 批量删除后 员工→订单 关联计数 × 20 20 1ms 14.00k/s
  221. 校验 全表扫描 删除后全量校验(公式) 9900000 24.326s 406.97k/s
  222. P6 校验 索引计数复核 Dept × 100 9900000 1m38.679s 100.33k/s
  223. P7 校验 新增列索引 Count(Level=777) 3 1ms 3.00k/s
  224. P7 校验 重建索引后 索引计数复核 Dept × 100 9900003 1m36.198s 102.91k/s
  225. 校验 core 全表扫描 P7 变更后全量校验 9900003 18.938s 522.75k/s
  226. 校验 core 全表扫描 重开后 core 全量校验 9900003 19.512s 507.39k/s
  227. 校验 全表扫描 重开后 ORM 全量校验 9900003 25.025s 395.60k/s
  228. 【校验总表】共 87 项: 通过 87, 失败 0
  229. 【数据问题清单】共 3 项
  230. 1. [设计约束] 引擎没有 RENAME COLUMN / RENAME TABLE API
  231. 改列名只能 DROP 旧列 + ADD 新列; 老行原值不会被迁移到新列名(数据仍在行内, 只是列名不可达), 需要业务侧自行回填
  232. 2. [重要语义] DROP COLUMN 是软删除, 数据仍留在行内; 重新 ADD 同名列会"复活"老行数据
  233. 这解释了为什么改列名(删+加新名)后数据看似丢失, 但加回旧列名后又能读到 → 敏感数据无法靠删列来清除, 需要重建表/覆写
  234. 3. [风险] ORM 重开表会按 struct 强制同步 schema, 静默删除 struct 里没有的列
  235. 纯 core 视角活跃列=[_id No Name Age Score Salary Active DeptName Dept] 含 DeptName, 调用 UseTable[Emp] 后活跃列=[_id No Name Age Score Salary Active Dept], DeptName 被自动 DropField; 手工加过列的表被 ORM 打开就会"丢列"(数据仍在行内, 再加回同名列可复活)
  236. 【结论】总耗时 29m11s | 校验 87/87 通过 | 数据问题 3 项
  237. 主库保留: D:\GOPATH\src\TsDB2\demo\bench_10m\bench_10m.db (2777.3MB) | 探针库: D:\GOPATH\src\TsDB2\demo\bench_10m\bench_10m_probe.db (0.6MB)
  238. 可将上述 .db 交给 analyzer 审计