完整结果如下,未注明的单位都是秒,越暗的格子越快: page size (bytes) | 1024 | 2048 | 4096 | 8192 | 16384 | 32768 | file size (bytes) | 6,518,057,984 | 8,241,479,680 | 8,241,385,472 | 8,231,018,496 | 6,586,433,536 | 6,584,467,456 | synchronous | FULL | OFF | FULL | OFF | FULL | OFF | FULL | OFF | FULL | OFF | FULL | OFF | HDD | INSERT INTO | a | 6.12 | 5.65 | 6.12 | 5.58 | 6.00 | 5.52 | 5.87 | 5.44 | 5.75 | 5.40 | 5.75 | 5.46 | b | 48.25 | 41.17 | 57.02 | 44.04 | 62.04 | 42.46 | 55.00 | 41.23 | 45.53 | 30.62 | 45.74 | 31.13 | c | 48.15 | 39.72 | 56.36 | 44.20 | 56.54 | 46.77 | 55.66 | 45.71 | 44.79 | 36.63 | 46.76 | 36.72 | SELECT COUNT (*) | before VACUUM | a1 | 0.23 | 0.21 | 0.22 | 0.19 | 0.55 | 0.48 | 0.26 | 0.21 | 0.21 | 0.17 | 0.20 | 0.19 | b1 | 71.14 | 96.80 | 126.71 | 150.36 | 139.94 | 161.63 | 51.64 | 71.43 | 39.61 | 59.25 | 40.71 | 61.68 | c1 | 13.30 | 15.01 | 36.66 | 35.39 | 13.73 | 15.34 | 7.94 | 7.59 | 3.43 | 3.30 | 1.24 | 0.97 | a2 | 0.04 | 0.03 | 0.23 | 0.16 | 0.55 | 0.55 | 0.34 | 0.35 | 0.20 | 0.17 | 0.22 | 0.17 | b2 | 0.44 | 0.44 | 127.56 | 129.53 | 140.05 | 139.97 | 81.47 | 83.51 | 45.77 | 45.33 | 40.60 | 40.31 | c2 | 0.06 | 0.05 | 36.48 | 36.49 | 13.81 | 15.69 | 6.16 | 6.04 | 2.99 | 3.13 | 0.89 | 0.67 | after VACUUM | a1 | 0.23 | 0.21 | 0.21 | 0.19 | 0.55 | 0.50 | 0.33 | 0.32 | 0.21 | 0.22 | 0.21 | 0.20 | b1 | 71.36 | 80.18 | 127.12 | 130.90 | 139.91 | 140.16 | 82.01 | 85.37 | 45.35 | 48.86 | 40.66 | 41.78 | c1 | 0.03 | 0.03 | 0.17 | 0.20 | 0.48 | 0.45 | 0.33 | 0.21 | 0.18 | 0.02 | 0.18 | 0.01 | a2 | 0.03 | 0.03 | 0.21 | 0.18 | 0.54 | 0.55 | 0.28 | 0.28 | 0.20 | 0.22 | 0.21 | 0.19 | b2 | 0.44 | 0.44 | 128.20 | 130.51 | 140.32 | 139.92 | 81.33 | 82.61 | 45.28 | 45.02 | 40.88 | 39.88 | c2 | 0.03 | 0.03 | 0.20 | 0.19 | 0.48 | 0.45 | 0.31 | 0.31 | 0.18 | 0.20 | 0.17 | 0.18 | VACUUM | 1413.67 | 1079.27 | 1549.42 | 1280.28 | 1354.26 | 1193.45 | 948.60 | 876.00 | 792.43 | 654.82 | 682.16 | 648.19 | SSD | INSERT INTO | a | 5.80 | 5.64 | 5.72 | 5.55 | 5.67 | 5.50 | 5.61 | 5.44 | 5.48 | 5.34 | 5.50 | 5.40 | b | 46.05 | 33.73 | 56.61 | 43.68 | 57.33 | 45.03 | 55.73 | 42.34 | 45.33 | 34.08 | 46.67 | 33.79 | c | 46.19 | 35.76 | 55.46 | 46.39 | 52.51 | 44.86 | 51.04 | 43.74 | 41.89 | 32.56 | 41.31 | 32.99 | SELECT COUNT (*) | before VACUUM | a1 | 0.07 | 0.07 | 0.07 | 0.07 | 0.22 | 0.21 | 0.06 | 0.06 | 0.07 | 0.06 | 0.06 | 0.06 | b1 | 17.82 | 28.53 | 50.74 | 62.63 | 60.28 | 72.55 | 17.93 | 29.57 | 14.41 | 25.82 | 14.01 | 24.77 | c1 | 0.84 | 0.87 | 0.99 | 0.96 | 0.50 | 0.50 | 0.37 | 0.50 | 0.11 | 0.30 | 0.05 | 0.05 | a2 | 0.04 | 0.03 | 0.07 | 0.07 | 0.22 | 0.21 | 0.13 | 0.13 | 0.10 | 0.10 | 0.08 | 0.08 | b2 | 0.49 | 0.49 | 50.75 | 50.70 | 60.18 | 60.75 | 38.38 | 39.44 | 22.63 | 23.53 | 18.55 | 20.09 | c2 | 0.06 | 0.06 | 0.99 | 0.98 | 0.19 | 0.50 | 0.28 | 0.27 | 0.10 | 0.13 | 0.04 | 0.03 | after VACUUM | a1 | 0.07 | 0.07 | 0.07 | 0.07 | 0.22 | 0.21 | 0.14 | 0.13 | 0.10 | 0.10 | 0.09 | 0.08 | b1 | 17.48 | 18.96 | 50.61 | 51.12 | 60.18 | 62.64 | 39.35 | 42.17 | 23.88 | 26.85 | 18.49 | 22.16 | c1 | 0.03 | 0.03 | 0.06 | 0.03 | 0.19 | 0.02 | 0.12 | 0.01 | 0.09 | 0.01 | 0.07 | 0.00 | a2 | 0.03 | 0.03 | 0.07 | 0.07 | 0.21 | 0.21 | 0.13 | 0.13 | 0.10 | 0.10 | 0.08 | 0.08 | b2 | 0.49 | 0.49 | 50.64 | 51.12 | 60.28 | 60.53 | 38.43 | 38.50 | 22.64 | 22.82 | 20.21 | 18.87 | c2 | 0.04 | 0.03 | 0.06 | 0.06 | 0.20 | 0.19 | 0.12 | 0.12 | 0.09 | 0.00 | 0.08 | 0.01 | VACUUM | 594.84 | 610.94 | 714.03 | 716.23 | 530.24 | 610.41 | 436.40 | 439.43 | 330.01 | 344.00 | 337.77 | 338.67 |
跑完了之后发现这个程序并不好,比如:插入的数据过于整齐,VACUUM 对性能几乎没有影响,而文件大小倒是大起大落;程序运行中间由于没有停顿,上一步操作的写入没完成就开始了下一步,由于 SQLite 的写入是异步的,这可能会影响计时。不过由于我不想再跑一遍了, 姑且就以这个结果来说明吧。首先 c 表很有意思,插入的效率和 b 表相当,但检索的效率有时甚至比 a 表还要快,这个与其说是数据库的改进方向还不如说是 SQLite 的 bug 。另外注意程序中没有用自带的 sqlite3 模块而是用了重新编译的 pysqlite2 ,这是因为 Python 2.6.5 final win32 amd64 的 sqlite3 是 2.5.9 版本,这个版本上 c 表在各种情况下都比 b 表慢。而 3.6.4 版本中引入了独特的 INDEXED BY 语句,我本想试试指定一个独立存放的索引能不能提升性能,结果 SQLite 已经优化了索引的选择。 即便是在这个 6G 的数据库中,page_size = 1024 性能也相当理想,也是唯一能缓存数据以备第二次检索的。将 page_size 设为 32768 对检索的改进都微乎其微(插入和 VACUUM 倒是不小)。至于 2048 和 4096 会导致文件大小增加了五分之一,速度也就狠狠地慢下来了。看来一般情况下 page_size 使用默认设置对于数据库性能和系统占用都是比较理想的,如果是数 G 以上的数据库倒是可以提高 page_size 。 在检索和 VACUUM 时 SSD 的速度大约是 HDD 的三倍,而 INSERT 几乎没有区别。由于 SSD 有写入寿命的限制,对于这种不怎么更新的数据库,似乎插入完成后再存到 SSD 比较好。 关掉 synchronous 对于插入也有三倍左右的提升,网上有人说 SSD 上 nosync 插入有 150 倍的速度提升,可是我没碰到。另外检索和 VACUUM 反而下降了是怎么回事?想不通……话说回来官网的测试也有不少 nosync 反而更快的结果。 总之 SQLite 的参数要根据实际情况来选择,而实际情况很复杂,可能还是要多测试——得到这样一个说了等于没说的结论。 |