我有一个包含许多表的SQLite数据库。我们正在编写一个维护工具,可以删除"陈旧"表中的数据,直到该表的大小是数据库文件总数的一定百分比或更小。
我知道如何确定数据库文件的大小 - 我是通过执行
来实现的PRAGMA PAGE_SIZE;
和
PRAGMA PAGE_COUNT;
在两个单独的查询中并将两者相乘以获取文件大小(以字节为单位)。是的,我知道我可以以字节为单位获取文件的大小,但这类似于我在其他数据库中完成它的方式,我想坚持使用它,至少目前是这样。
我的问题是我不知道如何获得TABLE的大小。必须有一些方法来做到这一点。有人能指出我正确的方向吗?
答案 0 :(得分:2)
您可以为此使用sqlite3_analyzer
tool,它可以是downloaded here。只需在您的数据库上运行它,它就会吐出很多有趣的统计信息,其形式也可以直接传递到另一个SQLite数据库中:
$ sqlite3_analyzer my_db.sqlite
答案 1 :(得分:1)
查询表的大小没有简单的方法。所以我最终做的是通过将行数乘以行大小的估计值来估计表的大小。我手动求和整数列的长度(每个4个字节),再加上长列的长度(每个8个字节)的总和,再加上使用查询估计字符串列的平均长度。像这样:
SELECT COUNT(*) * -- The number of rows in the table
( 24 + -- The length of all 4 byte int columns
12 + -- The length of all 8 byte int columns
128 ) -- The estimate of the average length of all string columns
FROM MyTable
唯一的问题是:
这对我们的实施来说已经足够了。您可能能够通过更复杂的查询来更好地计算表的大小,该查询采用空值和考虑字符串列的实际长度。
答案 2 :(得分:0)
如果使用SQLITE_ENABLE_DBSTAT_VTAB
编译SQLite,则可以查询dbstat
表。这应该返回表TABLENAME
的表大小:
SELECT SUM("pgsize") FROM "dbstat" WHERE name='TABLENAME';
https://www.sqlite.org/dbstat.html
这是sqlite3_anazlyer CLI工具使用的工具,也可以用于此目的。