【发布时间】:2019-12-18 06:12:08
【问题描述】:
我创建了一个 SQLite 数据库,其中包含两个表:day 和 data。第一个表包含每天的日期,带有一个id,第二个表存储每天对应的数据,带有日期的id。
是否可以获取以 kb 为单位的表数据大小,或者仅获取每天的数据大小?
【问题讨论】:
-
出了什么问题?
我创建了一个 SQLite 数据库,其中包含两个表:day 和 data。第一个表包含每天的日期,带有一个id,第二个表存储每天对应的数据,带有日期的id。
是否可以获取以 kb 为单位的表数据大小,或者仅获取每天的数据大小?
【问题讨论】:
是否可以获取以 kb 为单位的表格数据大小,或者仅获取每天的数据大小?
Kb per table 不容易,如果有的话。
您可以利用length() 函数收集存储数据大小的近似值。
对于 example(请注意一个关于长度的非常简单的示例,因为这取决于字符编码,例如在 UTF-8 中,一个字符可以占用 1-4 个字节)consdier 基于以下内容您的描述(2 个表格day 和 data)
DROP TABLE IF EXISTS day;
DROP TABLE IF EXISTS data;
CREATE TABLE IF NOT EXISTS day (id INTEGER PRIMARY KEY, date TEXT UNIQUE);
CREATE TABLE IF NOT EXISTS data(id INTEGER PRIMARY KEY, dateofdata_reference INTEGER REFERENCES day(id) ON DELETE CASCADE ON UPDATE CASCADE, datacolumn1 TEXT, datacolumn2 TEXT);
/* Add 3 days */
INSERT INTO day (date) VALUES('2019-01-01'),('2019-01-02'),('2019-01-03');
/* Add some data to each day assuming id of a day as 1,2 and then 3 for the 3 days */
INSERT INTO data (dateofdata_reference, datacolumn1,datacolumn2) VALUES
(1,'A','XYZ'),(1,'ABC','UVW'),(1,'ABCD','RST') /* day 1 */
,(2,'Z','ZYX'),(2,'Y','WVU'),(2,'ZZ','TSR'),(2,'YYY','QPO') /* day 2 */
,(3,'J','1234567890') /* day 3 */
;
/* Combined length of data for entire table (excludes 1 and dateofdata_reference) */
SELECT sum(length(datacolumn1)) + sum(length(datacolumn2)) AS size FROM data;
/* Combined length of data and other stats per day (excludes id and dateofdata_reference) */
SELECT
date,
sum(length(datacolumn1)) + sum(length(datacolumn2)) AS size,
count() AS rowsPerDay,
avg(length(datacolumn1) + length(datacolumn2)) AS averageRowSize,
avg(length(datacolumn1)) AS averageDataColumn1Size,
avg(length(datacolumn2)) AS averageDataColumn2Size
FROM data AS a
JOIN day ON dateofdata_reference = day.id
GROUP BY dateofdata_reference;
/* Cleanup demo environment */
DROP TABLE IF EXISTS data;
DROP TABLE IF EXISTS day;
第一个(大约表大小)查询结果:-
【讨论】: