【问题标题】:Can Materialized Views in PostgreSQL inherit?PostgreSQL 中的物化视图可以继承吗?
【发布时间】:2017-07-12 15:20:59
【问题描述】:

我将 PostgreSQL 用于时间序列数据。有一个 Event 表和分区表,如 Event_2016、Event_2017,它们从 Event 继承,并带有日期范围的 CONSTRAINT CHECK。所以在查询 Event 表时,PostgreSQL 只使用需要的子表。

为了汇总事件,我使用 EventByDay 物化视图。刷新它需要读取所有 Event_* 表。

我可以像上表一样使用物化视图来限制每个物化视图中的数据量吗? (EventByDay_2016 继承自 EventByDay)。

【问题讨论】:

    标签: postgresql time-series materialized-views


    【解决方案1】:

    不,MVIEW 不能参与表继承。

    但是您可以创建一个(常规)子表,然后使用来自 MVIEW 的查询使用insert into .. select ...。如果要将 MVIEW 的查询存储在数据库中,则创建一个用于填充子表的视图。

    类似这样的:

    初始设置:

    create view v_event_by_day_2016 
    as 
    -- this is the complete query from your MVIEW
    select ...;
    
    create table event_by_day_2016
    as
    select *
    from v_view_one;
    
    alter table event_by_day_2016 inherit event_by_day; 
    alter table event_by_day_2016 add constraint check (...);
    

    刷新表格:

    truncate table event_by_day_2016;
    insert into event_by_day_2016
    select *
    from v_event_by_day_2016;
    

    您也可以使用delete 来以事务方式刷新子表中的数据。

    【讨论】:

    • 谢谢,“截断 .. 插入”会显示与 MVIEW 上的并发刷新不同的行为?
    • @StephanSchmidt:是的。这就是为什么我还提到了delete 方法,该方法仅在您提交删除和插入后才使更改可见。
    • 好吧,那我就走那条路,希望 Postgres 以后支持对 MVIEW 进行部分更新或者继承 MVIEW。
    猜你喜欢
    • 2014-10-27
    • 2020-02-20
    • 1970-01-01
    • 2011-03-04
    • 2011-12-10
    • 2020-03-13
    • 1970-01-01
    • 2022-08-09
    • 2017-01-08
    相关资源
    最近更新 更多