返回SQLite数据库中表的大小的查询

时间:2014-12-19 19:05:39

标签: database sqlite

我有一个包含许多表的SQLite数据库。我们正在编写一个维护工具,可以删除"陈旧"表中的数据,直到该表的大小是数据库文件总数的一定百分比或更小。

我知道如何确定数据库文件的大小 - 我是通过执行

来实现的
PRAGMA PAGE_SIZE;

PRAGMA PAGE_COUNT;

在两个单独的查询中并将两者相乘以获取文件大小(以字节为单位)。是的,我知道我可以以字节为单位获取文件的大小,但这类似于我在其他数据库中完成它的方式,我想坚持使用它,至少目前是这样。

我的问题是我不知道如何获得TABLE的大小。必须有一些方法来做到这一点。有人能指出我正确的方向吗?

3 个答案:

答案 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

唯一的问题是:

  • 它会高估任何具有整数或长列的行的大小,该行可以为null,并且恰好为null
  • 会高估或低估字符串列的长度。
  • 它没有考虑索引的大小。

这对我们的实施来说已经足够了。您可能能够通过更复杂的查询来更好地计算表的大小,该查询采用空值和考虑字符串列的实际长度。

答案 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工具使用的工具,也可以用于此目的。