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 / dba / Perguntas / 332402
Accepted
Andrey B. Panfilov
Andrey B. Panfilov
Asked: 2023-10-22 23:03:51 +0800 CST2023-10-22 23:03:51 +0800 CST 2023-10-22 23:03:51 +0800 CST

A nocividade da ociosidade nas conexões transacionais é um mito?

  • 772

Existem algumas fontes na internet que insistem que idle in transactionas conexões podem impedir que o vácuo limpe tuplas mortas. Abaixo estão alguns exemplos:

Guia do usuário para Aurora :

Uma transação no estado inativo em transação pode conter bloqueios que bloqueiam outras consultas. Ele também pode impedir que VACUUM (incluindo autovacuum) limpe linhas mortas, levando ao inchaço do índice ou da tabela ou ao wraparound do ID da transação .

Blog da Cybertec

Na verdade, uma transação longa não é um problema – o problema começa se for necessária uma transação longa e muitas pequenas alterações. Lembre-se: a transação longa pode fazer com que o VACUUM não limpe suas linhas mortas .

Na verdade, existem muitos deles, mas do meu ponto de vista isso parece absolutamente ridículo: na maioria dos casos, o nível de isolamento da transação é lido como confirmado, o que, por sua vez, significa que não há necessidade de manter tuplas mortas para tais transações, além disso, encontrei alternativas opinião sobre esse assunto :

Na verdade, não se trata de transações de longa duração, mas de instantâneos de longa duração . Certamente uma instrução select ou insert de longa duração fará isso. Para níveis de isolamento superiores aos de leitura confirmada, toda a transação reterá o instantâneo até que seja inativo ; portanto, se alguém abrir uma transação de leitura repetível e depois sair de férias sem confirmá-la, isso seria um problema. As transações preparadas suspensas também funcionarão (se você não sabe o que é uma transação preparada, provavelmente não as está usando).

ou o comentário de Pavel Luzanov na postagem do blog Cybertec :

Acredito que esse exemplo de transação longa seja verdadeiro apenas para o nível de isolamento de leitura repetível (ou serializável). Mas por padrão BEGIN usou Read Commited. Portanto, após o término de SELECT na primeira sessão, VACUUM removerá as linhas mortas em uma tabela após os comandos UPDATE, DELETE subsequentes na sessão 2.

o que foi confirmado por @ Bill Karwin em sua resposta (obrigado!)

A questão é: existem cenários “válidos” “não ficcionais” em que idle in transactionas conexões devem ser consideradas prejudiciais? (Não estou perguntando sobre transações com nível de isolamento superior a leitura confirmada, vazamentos de transação ou conexão, longos bloqueios de transação, etc.).

postgresql
  • 2 2 respostas
  • 893 Views

2 respostas

  • Voted
  1. Best Answer
    Laurenz Albe
    2023-10-23T11:08:14+08:002023-10-23T11:08:14+08:00

    É verdade que uma transação em si não bloqueia o progresso de VACUUM. Uma transação só é bloqueada VACUUMse uma destas duas condições for satisfeita:

    1. A transação possui um ID de transação atribuído (ou seja, algo foi modificado naquele banco de dados).

    2. A transação contém um instantâneo do banco de dados. Um instantâneo é uma estrutura de dados que determina quais outras transações são visíveis para determinadas transações. Os instantâneos são mantidos abertos

      • contanto que uma instrução SQL esteja em execução (portanto, uma consulta de longa duração pode bloquear VACUUMo progresso)

      • enquanto houver um cursor aberto

      • no nível REPEATABLE READou SERIALIZABLEisolamento, durante toda a duração da transação

    Você pode usar a consulta do meu artigo sobre o assunto para ver se há uma transação que bloqueia VACUUMo progresso de:

    SELECT pid, datname, usename, state, backend_xmin, backend_xid
    FROM pg_stat_activity
          /* holds a snapshot */
    WHERE backend_xmin IS NOT NULL
          /* has a transaction ID */
       OR backend_xid IS NOT NULL
    ORDER BY greatest(age(backend_xmin), age(backend_xid)) DESC;
    
    • 4
  2. Bill Karwin
    2023-10-23T00:12:20+08:002023-10-23T00:12:20+08:00

    Na verdade, as transações confirmadas por leitura não bloqueiam o vácuo.

    Demonstração:

    Criei uma tabela com 2 20 linhas. Podemos ver que ele tem muitas tuplas vivas e 0 tuplas mortas.

    postgres=# select n_live_tup, n_dead_tup, relname from pg_stat_all_tables where relname='mytable';
     n_live_tup | n_dead_tup | relname 
    ------------+------------+---------
        1048576 |          0 | mytable
    

    Então eu consulto em uma transação, mas não confirmo ainda. Isso estabelece um instantâneo.

    postgres=# start transaction;
    START TRANSACTION
    postgres=*# select count(*) from mytable;
      count  
    ---------
     1048576
    (1 row)
    

    Em uma segunda janela, excluo metade das linhas.

    postgres=# delete from mytable where id % 2 = 0;
    DELETE 524288
    

    Como a transação da minha primeira janela é confirmada por leitura por padrão, ela atualiza seu instantâneo para ver os resultados das exclusões.

    postgres=*# select count(*) from mytable;
     count  
    --------
     524288
    (1 row)
    

    Ainda não cometi essa transação.

    Se eu medir as tuplas mortas rapidamente, verei que elas ainda estão na mesa.

    postgres=# select n_live_tup, n_dead_tup, relname from pg_stat_all_tables where relname='mytable';
     n_live_tup | n_dead_tup | relname 
    ------------+------------+---------
         524288 |     524288 | mytable
    

    Tudo o que preciso fazer é esperar que autovacuum_naptimeo autovacuum seja executado. Este é 1 minuto por padrão.

    postgres=# select n_live_tup, n_dead_tup, relname from pg_stat_all_tables where relname='mytable';
     n_live_tup | n_dead_tup | relname 
    ------------+------------+---------
         524288 |          0 | mytable
    
    • 2

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

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