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

irlmq6kh  于 2023-01-21  发布在  SQLite
关注(0)|答案(4)|浏览(215)

我有一个SQLite数据库,它包含了许多表,我们正在编写一个维护工具,它将从表中删除“过时”的数据,直到该表的大小达到数据库文件总量的一定百分比或更小。
我知道如何确定数据库文件的大小--我通过执行

PRAGMA PAGE_SIZE;

以及

PRAGMA PAGE_COUNT;

在两个独立的查询中,然后将两者相乘,得到文件的字节大小,是的,我知道我可以只取文件的字节大小,但这与我在其他数据库中的做法相似,我想坚持使用它,至少现在是这样。
我的问题是我不知道如何得到一张table的大小。一定有什么方法可以做到这一点。谁能给我指出正确的方向?

vom3gejh

vom3gejh1#

如果SQLite是用SQLITE_ENABLE_DBSTAT_VTAB编译的,你可以查询dbstat表,这应该返回表TABLENAME的表大小(字节):

SELECT SUM("pgsize") FROM "dbstat" WHERE name='TABLENAME';

https://www.sqlite.org/dbstat.html
这是sqlite3_anazlyer CLI工具使用的内容,该工具也可用于此目的。

niwlg2el

niwlg2el2#

你可以使用sqlite3_analyzer tool来完成这个任务,它可以是downloaded here,只要在你的数据库上运行它,它就会吐出很多有趣的统计数据,而且这些数据也可以通过管道直接传输到另一个SQLite数据库中:

$ sqlite3_analyzer my_db.sqlite
xhv8bpkk

xhv8bpkk3#

查询表的大小并不容易,所以我最后做的是通过将行数乘以行大小的估计值来得出表大小的估计值。我手动计算了整数列的长度(每个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

唯一的问题是:

  • 它将高估任何包含整数或长列(可以为空)的行的大小,而这些行恰好为空
  • 它会高估或低估管柱的长度。
  • 它不考虑索引的大小。

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

z9zf31ra

z9zf31ra4#

试试这个:

SELECT name ,SUM(pgsize)/1024 table_size  FROM "dbstat" GROUP BY name ORDER BY table_size desc;

相关问题