Postgresql
替換 Postgres 中的物化視圖
我有一個物化視圖
Postgres 9.3
,我想用新列進行更新。但是,其他物化視圖也依賴於該視圖,並且錯誤消息表明當其他對象依賴於該視圖時,無法刪除該視圖。錯誤:無法刪除物化視圖 latest_charges,因為其他對象依賴於它
從文件中還可以看出,REPLACE 關鍵字對於物化視圖無效。除了刪除所有依賴對象並重建每個對象之外,還有什麼捷徑嗎?
從 PostgreSQL 9.4 開始:與CREATE VIEW的文件不同,CREATE MATERIALIZED VIEW的文件沒有提到 REPLACE 關鍵字。除了刪除所有依賴對象並重建每個對象之外,似乎沒有捷徑可走。
當你這樣做時,我只能推薦兩件小事:
- 使用 DROP MATERIALIZED VIEW blabla CASCADE 獲取所有依賴對象的列表
- 在一個事務中刪除和重新創建所有依賴對象。
對於我的情況,我更喜歡使用視圖層來限制下降:
- 創建以“_new”為後綴的物化視圖的副本,並使用“WITH NO DATA”來提高性能,確保還使用後綴創建任何索引以及通過 DROP…CASCADE 發現的任何其他依賴對象
- 在新的物化視圖上創建一個視圖以提供抽象層,因此我只需要在一個地方更改它
- ALTER 現有依賴項改為引用新視圖(如果需要提前刷新數據)
- 刪除現在不應有任何依賴項的原始物化視圖和索引
- 更改物化視圖和索引以刪除後綴以恢復原始名稱
例如。
create table test (myfield int); insert into test values (1); create materialized view mv_test as select myfield from test; create view v_test as select myfield from mv_test; select * from v_test; create materialized view mv_test_new as select myfield, myfield+1 as myfield2 from test; alter view v_test rename to v_test_old; alter materialized view mv_test rename to mv_test_old; create view v_test as select myfield,myfield2 from mv_test_new; select * from v_test; alter materialized view mv_test_new rename to mv_test; drop view v_test_old; -- when ready drop materialized view mv_test_old; -- when ready