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语句,可用于创建具有使用情况统计信息的数据库,然后您可以对其进行分析.
小智 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)
如果您使用的是 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”命令的字符串长度,因此不会等于磁盘上的实际大小,但对我来说,计数加上估计大小比其他替代方法(例如页计数)更有用。
我意识到这个答案完全违背了问题的精神,但它确实让你的大小没有复制文件......
$ 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)