为何带WITHOUT ROWID的SQLite数据库体积大440%?
WITHOUT ROWID表的存储与性能异常现象
我创建了如下表:
CREATE TABLE IF NOT EXISTS image_table ("name" TEXT PRIMARY KEY, "data" BLOB) WITHOUT ROWID;
并准备了插入SQL语句:
INSERT INTO image_table (name, data) VALUES (?1, ?2);
执行的插入操作:
- 将1000字节的BLOB绑定到参数
?2,将"name"+序号(如name1、name2等)绑定到?1作为主键 - 循环执行100000次插入,主键名称大小约5-10字节可忽略,总数据量约100MB(100000*1000字节)
遇到的异常情况:
- 使用
WITHOUT ROWID时,最终数据库文件大小为444MB;不使用该选项时仅约100MB - 执行
VACUUM命令后,WITHOUT ROWID表的数据库大小仅降至338MB - 原本预期
WITHOUT ROWID能通过消除冗余索引提升效率,这个巨大差异是在他人无法复现我的结果时偶然发现的
补充说明:
- 使用
WITHOUT ROWID会导致插入速度慢一倍,我打算不再使用该选项 - 若将BLOB大小改为10字节,
WITHOUT ROWID表的插入速度与普通表相当,且文件体积仅为普通表的一半,这一现象令人困惑
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

