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% -- 索引占用大小典型问题解读
Unused bytes 空闲占比很高(>20%) 大量DELETE之后,SQLite只是标记页面空闲,不会归还磁盘操作系统,文件体积不会缩小。 👉 执行
VACUUM;重建数据库,回收空闲空间。索引占用页数巨大 索引建太多,索引体积甚至接近数据表本身,写入会变慢,考虑删除无用索引。
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 | 只读分析数据库存储、碎片、表索引空间报告 |
小提示:
- 分析的时候数据库可以被业务程序打开读写,工具只读;但大库分析会扫描全部页,会吃IO,避开业务高峰。
- 报告很长,不要直接看控制台输出,务必重定向输出到txt文件查看。