2

我需要在磁盘上存储一个非常简单的数据结构 - 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 将是一个糟糕的选择。

未来的研究对我来说似乎太难了(至少在今天)。期待有经验的大侠帮忙。

4

2 回答 2

1

B 树是选择数据范围的最有效的组织。

如果您搜索一个常event_id量值和一个值范围,则只有当是索引中的第一列时,moment双列索引才能用于两个查找:event_id

CREATE TABLE points (
    event_id INTEGER NOT NULL,
    moment INTEGER NOT NULL,
    value NUMERIC NOT NULL,
    PRIMARY KEY (event_id, moment)
);

您应该尝试使用 3.8.2 版本,以便可以使用 WITHOUT ROWID 优化。开发人员
可能 会很高兴有人会测试此功能,并为您提供已编译的预发布版本。

于 2013-11-15T08:00:20.630 回答
-1

我认为如果您的表将使用多个用户,您不应该使用嵌入式数据库
Oracle 怎么样 - 按索引组织的表(可能按事件)+ 按范围
分区或 MySql 按范围分区

如果在您的应用程序中真的是一个用户,也许您可​​以使用文件系统?
像分区表 之类的东西,
您可以创建名称与范围相关的文件夹,
并创建名称与 event_id 相关的文件,因此您只需要在文件中存储时刻 + 数据
甚至更多,例如您的时刻看起来像
201311141820001234567890123456
您可以创建名称为 2013111418 的文件夹并存储在仅归档部分时刻和数据
20001234567890123456,数据
20001234567890123457,数据

于 2013-11-14T16:21:39.493 回答