我有一个包含许多表的SQLite数据库.我们正在编写一个维护工具,它将从表中删除"陈旧"数据,直到该表的大小为总数据库文件的某个百分比或更小.
我知道如何确定数据库文件的大小 - 我是通过执行来实现的
PRAGMA PAGE_SIZE;
Run Code Online (Sandbox Code Playgroud)
和
PRAGMA PAGE_COUNT;
Run Code Online (Sandbox Code Playgroud)
在两个单独的查询中,并将两者相乘以获取文件大小(以字节为单位).是的,我知道我可以以字节为单位获取文件的大小,但这与我在其他数据库中完成它的方式类似,我想坚持使用它,至少目前是这样.
我的问题是我不知道如何获得TABLE的大小.必须有一些方法来做到这一点.谁能指出我正确的方向?
Chr*_* K. 18
如果 SQLite 是用 编译的SQLITE_ENABLE_DBSTAT_VTAB,则可以查询dbstat表。这应该返回 table 的表大小TABLENAME:
SELECT SUM("pgsize") FROM "dbstat" WHERE name='TABLENAME';
Run Code Online (Sandbox Code Playgroud)
https://www.sqlite.org/dbstat.html
这是sqlite3_anazlyer CLI 工具所使用的,也可以用于此目的。
您可以使用此sqlite3_analyzer工具,可以在此处下载。只要在您的数据库上运行它,它就会吐出很多有趣的统计信息,其形式也可以直接传递到另一个SQLite数据库中:
$ sqlite3_analyzer my_db.sqlite
Run Code Online (Sandbox Code Playgroud)
小智 5
尝试这个:
SELECT name ,SUM(pgsize)/1024 table_size FROM "dbstat" GROUP BY name ORDER BY table_size desc;
Run Code Online (Sandbox Code Playgroud)
没有简单的方法来查询表的大小。因此,我最终所做的就是通过将行数乘以行大小的估计值来估计表的大小。我手动计算了整数列的长度(每个 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
Run Code Online (Sandbox Code Playgroud)
唯一的问题是:
这对于我们的实施来说已经足够好了。您也许可以使用更复杂的查询来更好地计算表的大小,该查询考虑空值和字符串列的实际长度。