我需要在磁盘上存储一个非常简单的数据结构 - Point
. 它的字段只是:
Moment
- 64位整数,表示高精度的时间EventType
- 32 位整数,引用另一个对象Value
- 64 位浮点数
要求:
1) ( Moment
+ EventType
) 对是 的唯一标识符Point
,所以我怀疑它是表的复合主键
2) 数量巨大Points
。高达 50 亿(1-2 TB 的磁盘空间)。所以格式必须尽可能小。
3) 表的典型和几乎单一用法是Points
按精确EventType
和范围检索(或创建视图)数百万Moments
。
问题:
选择哪个 RDBMS,为什么?
表的最佳 sql 定义是Points
什么?
并且在下面对我的想法发表评论也很感激
我的研究:
我是 RDBMS 领域的新手,但我听说过很多关于 SQLite 的信息。我不需要一个庞大的专业系统,它包含所有工具、功能和扩展,如 PostgreSQL 或 MSSQL。此外,我觉得我不需要服务器而不是简单的“嵌入式”数据库文件,因此 SQLite 的选择看起来是最佳选择。另一个具有嵌入式数据库功能的优秀 RDBMS 是 Firebird,但我被 SQLite 的动态类型范式所吸引。看起来它可以为我节省磁盘空间,因为整数字段可以以“较小”的形式存储(1、2、3、4、6 字节)。
但很快问题就出现了。
首先,ROWID
当主键是复合时,SQLite 创建特殊列(64 位长度):
CREATE TABLE points (
moment integer not null,
event_id integer not null,
value numeric not null,
PRIMARY KEY (moment, event_id)
);
这意味着桌子浪费了将近 40% 的空间。
我找到了关于“无 ROWID 优化”的好文章。但它仅在 SQLite 的 3.8.2 版本(2013 年 12 月)中可用。等待我需要的 ADO.NET 提供程序是不合适的。
另一个问题是 SQLite 对表使用B-tree。我不确定,但看起来选择数据范围效率低下。我的主要任务是根据主键的范围选择一大块Points
,所以看起来 SQLite 将是一个糟糕的选择。
未来的研究对我来说似乎太难了(至少在今天)。期待有经验的大侠帮忙。