更新:有一个评论说问题不明确,我做了一个逻辑上的飞跃声称我将拥有1180亿行。我编辑了下面的文字以澄清事情。请参阅下面的斜体文字
我一直在努力解决这个问题,甚至走了几条道路,但我现在转向社区寻求创意。首先,问题 - 为网格中的单元格存储六个每日变量〜25年。
针对两种不同类型的查询优化商店 -
查询一:检索一天中所有或部分单元格的单个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,不是解决这个问题的正确工具,在这种情况下,对替代品的建议也是受欢迎的。
答案 0 :(得分:1)