使用星型模式进行Postgres表分区

时间:2015-02-19 15:04:15

标签: postgresql partitioning

我有一个模式,其中包含一个包含大部分数据的表customer,以及另外三个表,其中customer.entry_id的外键引用是BIGSERIAL字段。其他三个表称为locationdevicesurls,我们在其中存储与客户表中特定条目相关的各种数据。

我想将客户表分成每月子表,并将该部分解决; customer将保持原样,每个月将有一个表customer_YYYY_MM,它继承主表并具有正确的CHECK约束,并且将在每个子表上创建索引。当主表保持空白时,数据将被移动到正确的子表。

我的问题是关于其他三个表,因为我也想对它们进行分区。但是,它们没有日期信息(根本没有),只有主表中对主键的引用。如何在这些表上设置约束?没有日期信息,它是否有意义或可能?

我的应用程序逻辑知道在哪里插入所有数据(它相当简单),但我希望能够执行简单的SELECT查询,而无需指定哪些子表来获取它。所以这应该像你期望的那样工作在非分区表中:

SELECT l.*
FROM customer c
JOIN location l USING entry_id
WHERE c.date_field > '2015-01-01'

2 个答案:

答案 0 :(得分:0)

我会用引用键对它们进行分区。外键用于连接条件,通常不会发生变化,因此它符合以下要点:

  • 主要在查询的WHERE子句或其他部分中使用的信息进行分区,其中可以使用分区来过滤掉不需要扫描的表格。正如one guide所说:
  

定义分区时的目标应该是允许尽可能多的查询从尽可能少的分区中获取数据 - 最好是一个。

  • 通过不会更改的信息进行分区,以便不断地将行从一个子表格抛出到另一个子表格

这当然也取决于桌子的大小。如果尺寸保持较小,则无需分区。

答案 1 :(得分:-1)

详细了解分区here

使用观点:

create view customer as
select * from customer_jan_15 union all
select * from customer_feb_15 union all
select * from customer_mar_15;

create view location as
select * from location_jan_15 union all
select * from location_feb_15 union all
select * from location_mar_15;