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

时间:2010-07-21 21:12:12

标签: postgresql partitioning

更新:有一个评论说问题不明确,我做了一个逻辑上的飞跃声称我将拥有1180亿行。我编辑了下面的文字以澄清事情。请参阅下面的斜体文字

我一直在努力解决这个问题,甚至走了几条道路,但我现在转向社区寻求创意。首先,问题 - 为网格中的单元格存储六个每日变量〜25年。

  • vars数量= 6
  • 细胞数量~1300万
  • 天数~9125(25 * 365)

针对两种不同类型的查询优化商店 -

查询一:检索一天中所有或部分单元格的单个var的值。这类似于图像,其中每个像素都是单个var的值。

查询二:检索单个单元格的单个var的所有日期或持续时间的值。这就像从表格中抓取一列,其中每行保存一天的所有变量。

所以,我开始设计数据库。单个表,其中每一行是一个单元格的值,

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
)

数据看起来像这样

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

问题:上表有13 m * 9125行~118亿行。巨大的索引,慢查询,加载数据的主要问题等等。

所以,我把这个表划分成几年如此

CREATE TABLE d_<yyyy> (
    CHECK ( yr = <yyyy> )
) INHERITS (d)
嗯......仍然不满意。我最终得到了1 + 25个表,但是现在每个表都有大约47.5亿行,查询仍然很慢。

所以,我把这一切都划分了几年和几天这样

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

每个表现在有1300万行,并且相当快(虽然仍然不能令人满意地快),但现在我有9K表。这有其自身的问题。我不能再查询主表了,因为Pg试图锁定所有表并耗尽内存。另外,我不能再进行上面的查询二了。我可以做类似

的事情
SELECT a FROM d_1980_1 WHERE cell_id = 1 
UNION 
SELECT a FROM d_1980_2 WHERE cell_id = 1 
UNION 
SELECT a FROM d_1980_3 WHERE cell_id = 1 
UNION 
SELECT a FROM d_1980_4 WHERE cell_id = 1 
UNION 
...

但上述情况并非最佳。

任何建议,想法,头脑风暴将不胜感激。也许Pg,甚至是RDBMS,不是解决这个问题的正确工具,在这种情况下,对替代品的建议也是受欢迎的。

1 个答案:

答案 0 :(得分:1)