SQLite表磁盘使用情况

Cri*_*sti 54 sqlite

如何在SQLite数据库中找到单个表的磁盘使用情况而不将其复制到新的空数据库中?

Fai*_*oor 80

您可以使用http://www.sqlite.org/download.html中的 sqlite3_analyzer .

这是一个非常酷的工具.它显示了每个表使用和不使用索引时使用的页数(默认情况下,每个页面为1024字节).

这是Northwind数据库的示例sqlite3_analyzer输出:

*** Page counts for all tables with their indices ********************

EMPLOYEES............................. 200         34.4% 
ORDERS................................ 152         26.2% 
CATEGORIES............................ 90          15.5% 
ORDER DETAILS......................... 81          13.9% 
CUSTOMERS............................. 17           2.9% 
SQLITE_MASTER......................... 11           1.9% 
PRODUCTS.............................. 7            1.2% 
SUPPLIERS............................. 7            1.2% 
TERRITORIES........................... 6            1.0% 
CUSTOMERCUSTOMERDEMO.................. 2            0.34% 
CUSTOMERDEMOGRAPHICS.................. 2            0.34% 
EMPLOYEETERRITORIES................... 2            0.34% 
REGION................................ 2            0.34% 
SHIPPERS.............................. 2            0.34% 
Run Code Online (Sandbox Code Playgroud)

它还生成SQL语句,可用于创建具有使用情况统计信息的数据库,然后您可以对其进行分析.

  • 请注意,sqlite3_analyze 需要很长时间才能运行。 (2认同)
  • 它在Linux上如何工作?我解压了,但是无法启动 (2认同)
  • 是的,64位Linux版本似乎丢失了。诡异的。 (2认同)

小智 8

可以从DBSTAT虚拟表中获取有关每个表或索引使用的所有页面的详细信息,也可以将其聚合以获取每个表或索引的磁盘使用情况。

例如,运行此查询以获取使用最多磁盘空间的前 10 个表:

SELECT name, sum(pgsize) AS size FROM dbstat GROUP BY name
  ORDER BY size DESC LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

  • 仅当 SQLite 已在启用“SQLITE_ENABLE_DBSTAT_VTAB”的情况下编译时才有效。幸运的是,对于 Ubuntu 19.10 等软件包来说,情况就是如此。 (4认同)

mwa*_*wag 6

如果您使用的是 linux 或 OSX,或者有可用的 unix 实用程序 awk(以及可选的排序),您可以执行以下操作以通过转储分析获取计数和估计大小:

# substitute '.dump' for '.dump mytable' if you want to limit to specific table
sqlite3 db.sqlite3 '.dump' | awk -f sqlite3_size.awk
Run Code Online (Sandbox Code Playgroud)

返回:

table            count   est. size
my_biggest_table 1090    60733958
my_table2        26919   7796902
my_table3        10390   2732068
Run Code Online (Sandbox Code Playgroud)

并使用 awk 脚本:

/INSERT INTO/ {                              # parse INSERT commands
    split($0, values, "VALUES");             # extract everything after VALUES
    split(values[1], name, "INSERT INTO");   # get tablename
    tablename = name[2];                     #
    gsub(/[\047\042]/, "", tablename);         # remove single and double quotes from name
    gsub(/[\047,]/, "", values[2]);          # remove single-quotes and commas
    sizes[tablename] += length(values[2]) - 3; # subtract 3 for parens and semicolon
    counts[tablename] += 1;
}

END {
    print "table\tcount\test. size"
    for(k in sizes) {
        # print and sort in descending order:
        print k "\t" counts[k] "\t" sizes[k] | "sort -k3 -n -r";

        # or, if you don't have the sort command:
        print k "\t" counts[k] "\t" sizes[k];
    }
}
Run Code Online (Sandbox Code Playgroud)

估计大小基于“INSERT INTO”命令的字符串长度,因此不会等于磁盘上的实际大小,但对我来说,计数加上估计大小比其他替代方法(例如页计数)更有用。


Dir*_*rom 5

我意识到这个答案完全违背了问题的精神,但它确实让你的大小没有复制文件......

$ ls -lh db.sqlite
-rw-r--r-- 1 dude bros 44M Jan 11 18:44 db.sqlite
$ sqlite3 db.sqlite
sqlite> drop table my_table;
sqlite> vacuum;
sqlite> ^D
$ ls -lh db.sqlite
-rw-r--r-- 1 dude bros 23M Jan 11 18:44 db.sqlite
Run Code Online (Sandbox Code Playgroud)

  • 同样,通过真空回收的空间可能已从其他桌子中回收,因此您可能需要真空清理;测试文件大小;下降表 真空; 测试文件大小 (2认同)