【问题标题】:Postgres table partitioning with star schemaPostgres 表分区与星型模式
【发布时间】:2015-02-19 15:04:15
【问题描述】:

我有一个架构,其中一个表包含大部分数据,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'

【问题讨论】:

    标签: postgresql partitioning


    【解决方案1】:

    我会按引用键对它们进行分区。外键用于连接条件,通常不会更改,因此它满足以下要点:

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

    定义分区时的目标应该是允许尽可能多的查询从尽可能少的分区中获取数据——理想情况下是一个。

    • 按不会更改的信息进行分区,这样就不需要经常将行从一个子表扔到另一个子表

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

    【讨论】:

    • 问题是引用键没有特定的边界——我不能提前制作表格,因为数据并不总是按顺序排列我可能有 1 月 31 日的数据,数据来自2 月 1 日,然后是 1 月 31 日的数据,导致主键乱序。出于这个原因,我更喜欢按日期进行分区,这很可能会发生(通过将日期字段也添加到“外部”表中)。
    【解决方案2】:

    阅读更多关于分区的信息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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 2022-11-23
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多