Eu tenho um grande banco de dados Postgres com muitas tabelas, algumas com dezenas de milhões de linhas. Vários processos de trabalho atualizam o banco de dados simultaneamente. Para pesquisas mais rápidas, os dados relevantes são compilados em uma visualização materializada.
Existem possivelmente vários processos paralelos gravando no banco de dados e, em seguida, atualizando a visualização materializada posteriormente. No entanto, como a consulta "REFRESH MATERIALIZED VIEW" leva pelo menos vários minutos, muitas vezes essas consultas se acumulam em uma fila e todas são executadas uma após a outra.
Infelizmente, nesses casos, apenas a consulta mais recente é relevante; todas as consultas anteriores consomem tempo de processamento em vão para atualizar dados obsoletos. Existe uma maneira de interromper as chamadas já em execução para "REFRESH MATERIALIZED VIEW" quando uma nova chamada é emitida?
Observe que "REFRESH MATERIALIZED VIEW CONCURRENTLY" tem o mesmo comportamento, mas retarda consideravelmente a atualização (de alguns minutos até uma hora), agravando assim o problema de desempenho.
É claro que é possível testar um bloqueio existente na visualização para cada nova consulta, por isso é fácil cancelar novas consultas; o problema é que prefiro cancelar as consultas antigas e manter apenas a mais recente...
Parece que você deseja atualizar as visualizações materializadas sempre que os dados nas tabelas forem alterados. Se você fizer isso com visualizações materializadas, levará muito tempo e as atualizações bloquearão umas às outras e às consultas.
Talvez você possa construir suas próprias visualizações materializadas “on commit refresh” como tabelas.
Um exemplo simples:
Ao invés de
você poderia fazer isso: