Postgresql 优化关系数据库中的日常数据存储

Postgresql 优化关系数据库中的日常数据存储,postgresql,partitioning,Postgresql,Partitioning,更新:有评论说问题不清楚,我的逻辑有了飞跃,声称我会有1180亿行。为了澄清问题,我编辑了下面的文本。请参阅下面的斜体文本 CREATE TABLE d_<yyyy>_<yday> ( CHECK ( yr = <yyyy> AND yday = <yday> ) ) INHERITS (d) 我已经为此奋斗了一段时间,甚至走了几条路,但我现在转向社区寻求想法。首先,问题是,在网格中存储六个每日变量约25年 CREATE TABLE d_

更新:有评论说问题不清楚,我的逻辑有了飞跃,声称我会有1180亿行。为了澄清问题,我编辑了下面的文本。请参阅下面的斜体文本

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
我已经为此奋斗了一段时间,甚至走了几条路,但我现在转向社区寻求想法。首先,问题是,在网格中存储六个每日变量约25年

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
  • 变量数=6
  • 细胞数~1300万
  • 天数~9125(25*365)
针对两种不同的查询优化存储-

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
查询一:检索一天内所有或部分单元格的单个var值。这类似于图像,其中每个像素都是单个var的值

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
查询二:检索单个单元格的所有天数或单个var的持续天数的值。这就像从表中抓取一列,其中每一行在一天内保存所有变量

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
因此,我开始设计数据库。如果一个表中的每一行都是一个单元格的一天值,则会这样

CREATE TABLE d (
    yr      SMALLINT,
    yday    SMALLINT,
    a       SMALLINT,
    b       SMALLINT,
    d       SMALLINT,
    e       SMALLINT,
    f       SMALLINT,
    g       SMALLINT,
    cell_id INTEGER
)
WITH (
    OIDS=FALSE
)
CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
数据看起来是这样的

yr      yday    a   b   c   d   e   f   g   cell_id
----------------------------------------------------
1980    1       x   x   x   x   x   x   x   1
1980    2       x   x   x   x   x   x   x   1
1980    3       x   x   x   x   x   x   x   1
..
1980    365     x   x   x   x   x   x   x   1
...
1981    1       x   x   x   x   x   x   x   1
1981    2       x   x   x   x   x   x   x   1
1981    3       x   x   x   x   x   x   x   1
..
1981    365     x   x   x   x   x   x   x   1
CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
问题:上表将有13m*9125行~1180亿行。庞大的索引、缓慢的查询、加载数据的主要问题等

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
所以,我把桌子分成几年,就像这样

CREATE TABLE d_<yyyy> (
    CHECK ( yr = <yyyy> )
) INHERITS (d)
CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
但上述情况并非最优

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)

任何建议、想法、头脑风暴都将不胜感激。也许Pg,甚至是RDBMS,都不是解决这个问题的合适工具,在这种情况下,我们也欢迎提供替代方案的建议。

如果不采用大规模索引或重复数据,我认为很难找到一个对两个查询都是最佳的模式设计

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
通过按日期或传感器对数据进行聚类,可以使其中一种条件下的检索快速运行,但不能同时执行这两种条件

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
假设按日期访问是最重要的,您可以按如下方式布局表:

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
CREATE TABLE d (
    day      DATE,
    a       SMALLINT[],
    b       SMALLINT[],
    ...
);
请注意,现在每天只有一行,单元格字段已成为数组,每个单元格都有自己的索引。如果单元格编号不是基于零的,则可以使用从单元格ID到数组索引的映射来拟合表

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
问题1

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
检索的单个变量的值 一个单元的全部或部分单元 一天

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
是通过,例如

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
SELECT a FROM d WHERE day = '1981-01-01'
问题2

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
检索单个单元格的单个var的所有天数或持续天数的值

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
将采用以下形式:

CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)
SELECT a[1000] FROM d WHERE day BETWEEN '1981' AND '1982'

我相信PostgreSQL中的大型数组是在不实际加载整个数据结构的情况下访问的。我知道斑点是。如果是这样的话,这个解决方案对你来说可能足够快了。否则,我建议对数据进行另一种查看,这样可以优化单元格的访问。

我敢说,但实际上我们可能需要更多的细节。我已经把你的问题读了四遍,但对于你想要完成什么,或者你如何能得到一个有数十亿行的表,我仍然感到困惑。请复习并修改你的问题。我怀疑你在逻辑上有了一些飞跃,也许会失去一些人。这听起来确实很有趣。(一点格式设置确实有帮助。)您能更具体地说明您希望对数据执行的操作类型吗?为什么要将它们存储在数据库中?如果您只有一个结构简单的表,并且只执行简单的查询,为什么不将它们放在一个大文件中呢?单元格网格可以用表表示吗?为什么要将数据存储在数据库中?为了查询的简单性和灵活性,特别是当需要不同类型的查询时(请注意我的查询1和查询2)。当然,我不确定RDBMS是否是正确的解决方案,我正在努力做出这个决定。
CREATE TABLE d_<yyyy>_<yday> (
    CHECK ( yr = <yyyy> AND yday = <yday> )
) INHERITS (d)