Postgresのマテリアライズドビューを置き換える


23

マテリアライズドビューがあり、Postgres 9.3新しい列で更新したい。ただし、他のマテリアライズドビューもこのビューに依存しており、エラーメッセージは、他のオブジェクトがそれに依存している場合、ビューの削除が不可能であることを示しています。

エラー:他のオブジェクトに依存しているため、マテリアライズドビューlatest_chargesを削除できません

また、ドキュメントから、REPLACEキーワードはマテリアライズドビューに対して有効ではないようです。すべての依存オブジェクトを削除し、各オブジェクトを再構築する以外にショートカットはありますか?


7
残念ながら、それらすべてをドロップして再構築することにこだわっていると思います。
クレイグリンガー14年

@CraigRingerはこれを回答として追加することに興味がありますか?
dezso 14

回答:


17

PostgreSQL 9.4以降:CREATE VIEWドキュメントとは異なり、CREATE MATERIALIZED VIEWのドキュメントではREPLACEキーワードに言及していません。すべての依存オブジェクトを削除し、各オブジェクトを再構築する以外に、ショートカットはないようです。

あなたがそうするとき、私は2つの小さなことしかお勧めできません:

  1. DROP MATERIALIZED VIEW blabla CASCADEを使用して、すべての依存オブジェクトのリストを取得します
  2. 1つのトランザクションですべての依存オブジェクトのドロップと再作成を行います。

1
おかげで、これはまさに私がやってきた方法です。私は他の多くのビューで再利用される分析目的のために1つの基本マテリアライズドビューを構築しているため、まっすぐに続けるのは苦痛です。そのベースビューはめったに変わりませんが、それに依存するビューは毎日変わります。
ジョン

4

私の状況では、ビューレイヤーを使用してドロップを制限することを好みます。

  1. サフィックス「_new」が付いたマテリアライズドビューのコピーを作成し、パフォーマンスのために「データなし」も使用します。また、DROP ... CASCADEで検出されたサフィックスおよびその他の依存オブジェクトを含むインデックスも作成されます。
  2. 新しいマテリアライズドビュー上にビューを作成して抽象化レイヤーを提供し、1か所で変更するだけです
  3. 代わりに新しいビューを参照するように既存の依存関係を変更します(事前に必要に応じてデータを更新します)
  4. 元のマテリアライズドビューとインデックスを削除します。これには依存関係はありません。
  5. マテリアライズドビューとインデックスを変更してサフィックスを削除し、元の名前を復元する

例えば。

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

これらの最後の2つのステップについては明確ではありません。4は5に続く文ですか?名前付きのマットビューとビューを使って簡単な例を実行できますか?
kimbo305

切り捨てられた文を修正し、例を追加
RuiDC

1

PgAdmin(バージョン4.x)では、プロパティボックスで定義を簡単に変更できました(where句を追加しました)。あなたの問題はそのように解決することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.