Skip to content

sqlite3_analyzer.exe 分析SQLite数据库

SQLite官方工具包自带,只读分析,不会修改数据库,底层基于 dbstat 虚拟表扫描数据库B‑Tree页结构。 作用:统计数据库内部存储、页占用、碎片、表/索引空间占比,定位:数据库文件虚胖、索引过大、删除大量数据后空闲空间、存储效率问题。

EXPLAIN QUERY PLAN 区分:

  • EXPLAIN QUERY PLAN:看SQL查询执行逻辑
  • sqlite3_analyzer.exe:看数据库文件物理存储结构、空间碎片

基础用法

直接输出报告到控制台:

cmd
sqlite3_analyzer.exe test_big.db

输出保存到报告文件(推荐)

cmd
sqlite3_analyzer.exe test_big.db > report.txt

报告本身同时是合法SQL文件,可以导入sqlite把统计数据存库,方便筛选查询:

cmd
sqlite3.exe stat.db < report.txt

报告重点看哪些字段

Page size in bytes......................... 4096      -- 数据库页大小
Size of file................................ 12582912  -- db文件总字节
Payload bytes............................... 34.2%     -- 真实有效数据占总文件比例
Unused bytes on all pages.................. 22.7%     ❗空闲浪费空间占比
Freelist pages.............................          -- DELETE产生的空闲页(没有释放给操作系统,只能内部复用)

*** Tables and Indexes ***
test_user                        182 pages  76.2%    -- 表占用页数、占库百分比
idx_user_name                     42 pages  17.6%    -- 索引占用大小

典型问题解读

  1. Unused bytes 空闲占比很高(>20%) 大量DELETE之后,SQLite只是标记页面空闲,不会归还磁盘操作系统,文件体积不会缩小。 👉 执行 VACUUM; 重建数据库,回收空闲空间。

  2. 索引占用页数巨大 索引建太多,索引体积甚至接近数据表本身,写入会变慢,考虑删除无用索引。

  3. Payload有效负载占比很低 存大量BLOB大字段,溢出页过多,IO性能差;大二进制建议存文件路径,不要放库内。

Windows 批处理:一键生成分析报告

新建 analyze.bat

batch
@echo off
chcp 65001 >nul
set "DB=test_big.db"
set "REPORT=analyze_report.txt"

sqlite3_analyzer.exe "%DB%" > "%REPORT%"
echo 分析完成,报告输出至:%REPORT%
notepad "%REPORT%"

配套维护SQL(发现碎片/空闲高之后执行)

sql
-- 重建索引,消除索引碎片
REINDEX;

-- 回收全部空闲空间,重建整个数据库文件,独占锁,业务低峰执行
VACUUM;

-- VACUUM 同时可以修改页大小
VACUUM page_size=4096;

SQLite工具集4兄弟小结

工具用途
sqlite3.exe主交互客户端,执行SQL、.dump.read
sqlite3_rsync.exe不停机一致性快照备份,本地/ssh远程增量复制db文件
sqldiff.exe对比两个db,输出差异SQL语句
sqlite3_analyzer.exe只读分析数据库存储、碎片、表索引空间报告

小提示:

  1. 分析的时候数据库可以被业务程序打开读写,工具只读;但大库分析会扫描全部页,会吃IO,避开业务高峰。
  2. 报告很长,不要直接看控制台输出,务必重定向输出到txt文件查看。