有没有办法检查Sqlite中单行占用了多少空间?
我尝试过使用这种方式:
我的表中有 4 个字段:
id(int)
name(text)
pat(text)
is_default(bool)
select *, sum(length(id)+length(name)+length(pat)+length(is_default))
from color;
但它返回字符长度(例如:43)。如何确定行长度(以字节为单位)?
正如这个答案中所暗示的,确定单行占用的确切空间是不可能的,因为——除其他原因外——一行可能不是页面大小的倍数,页面大小是数据库的主要空间单位文件。
最好的方法是计算每一行的近似大小,然后将它们相加。 sqlite3_analyzer 是一个可行的选项,但是如果您需要
DML
语句中的行大小怎么办?下面重点讨论后者。
SQLite 数据存储因其动态类型系统而变得复杂,除非在表上使用
STRICT
。然后需要考虑 TEXT
编码,该编码在 v3.43.2 中通过 octet_length()
解决,给出了其精确的二进制大小。 length(BLOB)
已经这样做了 BLOB
s。然后,INTEGER
的大小可变,在某些情况下甚至是REAL
。那么有没有PK和看不见的ROWID
柱的问题。是否应该将索引视为表的一部分?然后你就拥有了所有元数据。
所有这些方面都可以汇总到一个
GENERATE ALWAYS ... VIRTUAL
列中,以便通过简单的 SELECT size FROM table;
查询提供快速有效的行大小估计。
我鼓励人们提出有关如何改进这些估计的见解。