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

Ton*_*ile 9 database sqlite

我有一个包含许多表的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 工具所使用的,也可以用于此目的。

  • `SELECT name, SUM("pgsize") FROM "dbstat" GROUP BY name;` 获取数据库中每个表的文件大小 (4认同)
  • 这适用于从 Ubuntu 19.10 存储库包安装的 SQLite。:-) (2认同)

Tho*_*mas 6

您可以使用此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)


Ton*_*ile 4

没有简单的方法来查询表的大小。因此,我最终所做的就是通过将行数乘以行大小的估计值来估计表的大小。我手动计算了整数列的长度(每个 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)

唯一的问题是:

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

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

  • COUNT(*) 函数返回符合条件的行数。其余数字确实是等于 164 的常量。它不会返回行的实际大小,只是估计表占用了多少空间。 (2认同)
  • SQLite 的问题在于,您无法根据表定义中指定的类型来判断行的列中存储的内容。这更多地取决于您用于将数据写入表的代码。我没有时间也没有必要走那么远,所以我只是整理了一些对我有用的东西。我不再从事那份工作,也不必再使用 SQLite,所以如果你想尝试一下,那就去吧。 (2认同)