2014-09-03 140 views
14

In Oracle, it is possible to refresh just part of the data。但是在PostgreSQL中,物化視圖自9.3(現在的版本)開始支持,並不長。所以我想知道:是否可以刷新PostgreSQL 9.3中物化視圖中的部分數據?如果是的話,該怎麼做?是否可以部分刷新PostgreSQL中的物化視圖?

+1

你能舉一個你的意思嗎?我認爲擁有物化視圖的重點只是顯示部分數據。 – Lucas 2014-09-03 09:54:49

+0

與甲骨文鏈接的答案並不十分引人注目。它說你可以強制換出分區MV的一個分區。由於Postgresql中的分區並不是真正的內置功能,而是您自己推出的東西,所以我想您也可以在Postgres中使用相同的方法。 – Thilo 2014-09-03 09:58:22

回答

20

PostgreSQL不支持物化視圖的漸進/部分更新。

9.4增加REFRESH MATERIALIZED VIEW CONCURRENTLY但它仍然必須完全重新生成。

希望如果有人足夠熱心,我們會在9.5中看到支持。儘管如此,只有通過用戶定義的觸發器/規則才能實現這個功能,並且需要特殊的支持來處理諸如count(...) ... GROUP BY ...的增量更新之類的事情。

但是,您引用的Oracle答案實際上並不是實際的增量刷新。這是分區刷新。爲了支持PostgreSQL本身,它首先必須支持真正的聲明式分區 - 雖然我們正在討論它是否可以在9.5中完成,但它不支持。

4

我剛碰到類似的問題。從Craig's answer學習,這是不可能的,我使用了一種解決方法。我解構物化視圖和在VIEW接合的各個部分:

  1. 對於所討論的每一列(material_col1material_col2等)創建MATERIALIZED VIEW,使用通用id柱。
  2. 使用常規VIEWfake_materialized_view)在id列加入MATERIALIZED VIEW小號表
  3. REFRESH MATERIALIZED VIEW需要
  4. 使用您的查詢上fake_materialized_view代替

VIEW看起來有點像這樣:

CREATE VIEW fake_materialized_view AS 
    SELECT m1.id, m1.col1, m2.col2 
    FROM material_col1 as m1 LEFT JOIN 
     material_col2 as m2 
     ON m1.id = m2.id; 
+0

不幸的是,這隻對「分區列」有幫助,而不是「分區行」(不一定映射到簡單的可定義分區,而是映射到單個行) – 2016-03-21 19:20:59

+0

@AndreasDietrich我想你可以用'UNION ALL'做類似的事情。 .. – n1000 2016-03-23 14:32:19