【发布时间】:2014-02-14 07:32:49
【问题描述】:
我们在应用程序中使用基于继承的分区。分区在列上,这样每个分区对于该列都有不同的值。像这样的:
CREATE TABLE base(
tblock INT NOT NULL,
-- other fields --
);
-- Create a partition
CREATE TABLE partition_1(
CHECK(tblock=1),
INHERITS base
);
有很多这样的分区,每个分区都有大量的记录(以百万计)。整体数据库大小以 TB 为单位。
在上述模式中,分区必须有一个列 tblock,即使每个分区在所有行中都有该列的常量值。这显然是在浪费磁盘空间。
有没有办法声明分区,这样它就不会在磁盘上实际存储 tblock 的值?
我们目前使用的是 Postgresql 9.2.6。
【问题讨论】:
-
除非有一些 other 键也专门标识哪个分区中的内容。你怎么知道哪一行得到了哪个 tblock?
-
@CraigRinger tblock 确定每行进入哪个分区,并在 WHERE 子句中用于约束排除。这意味着时间阻塞。没有其他钥匙。当然,数据结构比显示的要复杂一些。
-
好的,所以应用程序有办法知道感兴趣的行的“tblock”是什么?如果是这样,请考虑让应用程序直接查询分区,而不是依赖约束排除;这样你就不再需要
tblock字段了。 -
@CraigRinger 谢谢。这是可能的,但非常痛苦。查询通常跨越很多分区。不过,我们确实将它用于某些查询类型。
-
我没有看到任何简单的解决方案。 Pg 的分区非常原始。嘿,我们正在寻找感兴趣的人来为更好的分区解决方案做出贡献....渴望深入了解源代码? ;-)