我有一个包含许多表的SQLite数据库.我们正在编写一个维护工具,该工具将从表中删除"陈旧"数据,直到该表的大小达到或小于整个数据库文件的一定百分比.

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

PRAGMA PAGE_SIZE;

PRAGMA PAGE_COUNT;

in two separate queries 和 multiplying the two to get the file size in bytes. Yes, I know I can just take the size of the file in bytes, but this is similar to the way I've done it in other databases 和 I want to stick with it, at least for now.

我的问题是我不知道怎样才能算出桌子的大小.一定有办法做到这一点.有谁能给我指个方向吗?

推荐答案

没有简单的方法来查询表的大小.因此,我最终做的是通过将行数乘以对行大小的估计得出表大小的估计值.我手动计算整数列的长度(每个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的整数列或LONG列的行的大小,而该列恰好为NULL
  • 它会高估或低估字符串列的长度.
  • 它没有考虑索引的大小.

这对于我们的实施来说已经足够好了.通过一个更复杂的查询,您可能可以更好地计算表的大小,该查询接受null&;考虑到字符串列的实际长度.

Database相关问答推荐

如何替换对象数组内的数组元素

如何理解mysql explain 命令

SQL 查询至少其中一项

在 PostgreSQL 的数组列中查找字符串

Entity Framework:如何检测对数据库的外部更改

MySQL workbench:如何将 mysql 数据库导出到 .sql 文件?

CouchDB 和 Lotus Notes 有什么区别?

我可以为 dapper-dot-net 映射指定数据库列名称吗?

如何在 2 个 MySQL 数据库之间传输数据?

返回 DataSet/DataTable 的 PowerShell 函数中的奇怪行为

nvarchar (50) 与 nvarchar (max) 的含义

生成和读取条形码

找不到类型或命名空间名称SQLConnection

cURL 和 PHP 显示1

如何在android中使用合同类?

如何使用 localdb 在 Code First 中查看数据库图

关系未更新的 NSFetchedResultsController

多币种 - 存储什么以及何时转换?

Hibernate hbm2ddl.auto 默认值

PostgreSQL 的 EXPLAIN ANALYZE 的 MySQL 类似功能是什么