AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-94875

wazoox's questions

Martin Hope
wazoox
Asked: 2022-03-24 07:42:01 +0800 CST

postgresql: conflito com "criar visão materializada" simultânea

  • 0

Esta é uma continuação da minha pergunta antiga Múltiplas "REFRESH MATERIALIZED VIEW" simultâneas: como gerenciar?

Agora, infelizmente, estou lutando com a coisa real depois de ter sido mais teórico inicialmente :)

Eu tenho um programa que envia muitas solicitações e, finalmente, atualiza uma visão materializada. Infelizmente, às vezes, dois jobs simultâneos solicitam sobreposição CREATE MATERIALIZED VIEW milestones_files(a visualização é muito grande e leva vários minutos para ser atualizada), então o último falha (obviamente), o que cancela toda a transação (o que é ruim, porque algumas atualizações do banco de dados também são descartadas ).

Aqui está o log quando o erro ocorre (sem todas as linhas SQL para abreviar):

2022-03-22 11:17:37.685 UTC [29004] storiq@storiqone ERREUR:  Bloquage mortel détecté
2022-03-22 11:17:37.685 UTC [29004] storiq@storiqone DÉTAIL:  Le processus 29004 attend AccessExclusiveLock sur relation 181019 de la base de données 19044 ; bloqué par le processus 29174.
2022-03-22 11:17:37.685 UTC [29004] storiq@storiqone ASTUCE :  Voir les journaux applicatifs du serveur pour les détails sur la requête.
2022-03-22 11:17:37.685 UTC [29004] storiq@storiqone INSTRUCTION :  CREATE MATERIALIZED VIEW milestones_files_29000 AS SELECT sa.id AS archive,
2022-03-22 11:17:37.691 UTC [29243] storiq@storiqone ERREUR:  could not open relation with OID 181019
2022-03-22 11:17:37.691 UTC [29243] storiq@storiqone INSTRUCTION :  SELECT REGEXP_REPLACE(pg_catalog.pg_get_ruledef(r.oid, TRUE), '^.*DO INSTEAD  (SELECT.*);$', '\1') FROM pg_catalog.pg_rewrite r WHERE r.ev_class = ( SELECT oid FROM pg_class WHERE relname = 'milestones_files')
2022-03-22 11:17:37.693 UTC [29243] storiq@storiqone ERREUR:  la transaction est annulée, les commandes sont ignorées jusqu'à la fin du bloc
2022-03-22 11:17:37.693 UTC [29243] storiq@storiqone INSTRUCTION :  UPDATE archivetoarchivemirror SET lastupdate = NOW(), jobrun = $1 WHERE archive = $2 OR jobrun = $1
2022-03-22 11:17:37.696 UTC [29243] storiq@storiqone ERREUR:  l'instruction préparée « update_archivemirrors » n'existe pas
2022-03-22 11:17:39.510 UTC [29004] storiq@storiqone ERREUR:  la transaction est annulée, les commandes sont ignorées jusqu'à la fin du bloc
2022-03-22 11:17:39.510 UTC [29004] storiq@storiqone INSTRUCTION :  UPDATE archivetoarchivemirror SET lastupdate = NOW(), jobrun = $1 WHERE archive = $2 OR jobrun = $1
2022-03-22 11:17:39.510 UTC [29004] storiq@storiqone ERREUR:  l'instruction préparée « update_archivemirrors » n'existe pas

É claro que eu poderia simplesmente colocar o CREATE MATERIALIZED VIEWcomando fora da transação principal, no entanto, a atualização mais recente ainda falharia, portanto, a exibição não refletiria as últimas alterações no banco de dados, o que ainda é um problema (menos sério).

Idealmente, eu gostaria que a atualização mais recente tivesse precedência, mas sem falhar na transação já em execução no outro processo (o que seria o caso se eu simplesmente matasse o outro processo após a verificação de bloqueios, conforme Kill concorrente materialized view refresh PID ) .

A partir da documentação, não parece que adicionar a CONCURRENTLYopção também resolveria meu problema (que não é sobre SELECTs simultâneos).

Qualquer sugestão bem vinda. É claro que eu poderia tentar implementar a solução proposta na minha pergunta antiga, embora fosse particularmente complexa, dadas as consultas e transações em cascata e o enorme banco de dados ...

postgresql materialized-view
  • 1 respostas
  • 72 Views
Martin Hope
wazoox
Asked: 2019-12-19 06:44:27 +0800 CST

Múltiplas "REFRESH MATERIALIZED VIEW" simultâneas: como gerenciar?

  • 1

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...

postgresql postgresql-9.6
  • 1 respostas
  • 2981 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve