Substituir uma vista materializada no Postgres


23

Eu tenho uma visão materializada de Postgres 9.3que gostaria de atualizar com novas colunas. No entanto, outras visualizações materializadas também dependem dessa visualização, e a mensagem de erro indica que a remoção de uma visualização não é possível quando outros objetos dependem dela.

ERRO: não é possível descartar a exibição materializada latest_charges porque outros objetos dependem dela

Também aparece na documentação que a palavra-chave REPLACE não é válida para uma visualização materializada. Existe algum atalho além de eliminar todos os objetos dependentes e reconstruir cada um?


7
Infelizmente, acho que você está preso em abandonar todos e reconstruir.
Craig Ringer

@CraigRinger está interessado em adicionar isso como resposta?
Dezso

Respostas:


17

A partir do PostgreSQL 9.4: Diferente da documentação do CREATE VIEW , a documentação do CREATE MATERIALIZED VIEW NÃO menciona a palavra-chave REPLACE. Parece não haver atalho além de eliminar todos os objetos dependentes e reconstruir cada um.

Quando você faz isso, só posso recomendar duas pequenas coisas:

  1. Use DROP MATERIALIZED VIEW blabla CASCADE para obter uma lista de todos os objetos dependentes
  2. Faça o descarte e recreação de todos os objetos dependentes em uma transação.

1
Obrigado, é exatamente assim que tenho feito isso. É muito difícil manter a linha reta, pois estou construindo uma visão materializada básica para fins analíticos que é reutilizada em muitas outras visões. Essa visão básica raramente muda, mas os que dependem dela mudam diariamente.
John

4

Para minha situação, prefiro limitar as gotas usando uma camada de visualização:

  1. Crie uma cópia da visualização materializada com o sufixo "_new" e use "WITH NO DATA" para obter desempenho, verifique se todos os índices também são criados com o sufixo e outros objetos dependentes descobertos via DROP ... CASCADE
  2. Crie uma visão sobre a nova visão materializada para fornecer a camada de abstração, para que eu só precise alterá-la em um só lugar
  3. ALTERE as dependências existentes para se referir à nova visualização (atualizando os dados se necessário com antecedência)
  4. Abandone a visualização materializada original e os índices que agora não devem ter dependentes
  5. ALTERAR A visualização e os índices materializados para eliminar o sufixo e restaurar os nomes originais

por exemplo.

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

Não estou claro sobre esses dois últimos passos. 4 é uma sentença que termina em 5? você poderia fazer um exemplo rápido com algumas matviews e visualizações nomeadas?
kimbo305

corrigiu a frase truncada e adicionou exemplo
RuiDC 23/07

1

No PgAdmin (versão 4.x), eu poderia modificar facilmente a definição (adicionei uma cláusula where) na caixa de propriedades. Seu problema pode ser resolvido dessa maneira.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.