我有以下 HSQLDB 架构:
CREATE TABLE RUNSTATS
(
ID BINARY(16) NOT NULL,
ENTITY BLOB(128K) NOT NULL
,CHECK (PUBLIC.RUNSTATS.ID IS NOT NULL)
,CHECK (PUBLIC.RUNSTATS.ENTITY IS NOT NULL)
);
ALTER TABLE RUNSTATS
ADD CONSTRAINT pk_runstats
PRIMARY KEY (ID);
CREATE TABLE RUNSTATS__AVGLATENCYINDEX
(
ID BINARY(16),
TIMESTAMP BIGINT,
FLOWID VARCHAR(200),
AVGLATENCY DOUBLE
);
ALTER TABLE RUNSTATS__AVGLATENCYINDEX
ADD CONSTRAINT pk_runstats__avglatencyindex
PRIMARY KEY (ID, FLOWID);
CREATE INDEX IDX_RUNSTATS__AVGLATENCYINDEX_FLOWID
ON RUNSTATS__AVGLATENCYINDEX (FLOWID ASC);
RUNSTATS 表在x.lobs文件中,RUNSTATS__AVGLATENCYINDEX - 在x.data中
我插入 RunStats 对象,每个对象在 RUNSTATS 表中产生 1 行,在 RUNSTATS__AVGLATENCYINDEX 中产生 100 行。我运行三个会话,插入 100、1000 和 10000 个 RunStats 对象。
另一个非常重要的细节 - 实际的 FLOWID 值都是 20 个英文字符长,尽管字段是 VARCHAR(200)
请在下面找到x.data文件的磁盘使用摘要(包含 RUNSTATS__AVGLATENCYINDEX 表):
- 10,000 行 = 2.0MB
- 100,000 行 = 16MB
- 1,000,000 行 = 128MB
现在原始计算: (sizeOf(ID) + sizeOf(FLOWID) + sizeOf(TIMESTAMP) + sizeOf(AVGLATENCY)) = 16 + 20 + 8 + 8 = 52
所以 1,000,000 行大约需要 52 * 1,000,000 = ~50MB
最佳尺寸比实际尺寸小两倍多。
这是正常的数据库开销吗?我可以指示 hsqldb 引擎更有效地利用空间吗?
更多上下文:
- 仅添加实体(从不删除)
- 有一个明确定义的时期,以固定速度添加实体。例如,每 10 秒一次,持续 3 天。之后 - 不再添加实体。
编辑
请在此处找到压缩脚本文件 - https://docs.google.com/file/d/0B2pbsdBJxJI3Z2dFTndMZnBMU2c/edit?usp=sharing