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 / 314894
Accepted
Dolphin
Dolphin
Asked: 2022-07-27 21:18:38 +0800 CST2022-07-27 21:18:38 +0800 CST 2022-07-27 21:18:38 +0800 CST

É possível nunca executar o vácuo completo no PostgreSQL

  • 772

Uma vez VACUUM FULLque as tabelas são bloqueadas, é inaceitável para nós em nosso ambiente de produção.

É possível executar apenas VACUUMe nunca VACUUM FULLem um sistema de produção?

Torna VACUUMo espaço reutilizável para novos INSERTs?

postgresql locking
  • 2 2 respostas
  • 81 Views

2 respostas

  • Voted
  1. Best Answer
    Vérace
    2022-07-28T07:25:57+08:002022-07-28T07:25:57+08:00

    Para entender as diferenças entre

    • VACUUM
    • VACUUM ANALYZE
    • VACUUM FULL,

    é necessário um conhecimento básico da arquitetura do PostgreSQL.

    De vários9s 1 nos é dito que:

    • O PostgreSQL não usa o mecanismo de atualização IN-PLACE, portanto, de acordo com a maneira como o comando DELETE e UPDATE é projetado,

      • Sempre que operações DELETE são executadas, ele marca a tupla existente como DEAD em vez de remover fisicamente essas tuplas.
      • Da mesma forma, sempre que a operação UPDATE é executada, ela marca a tupla existente correspondente como DEAD e insere uma nova tupla (ou seja, operação UPDATE = DELETE + INSERT).

    Isso leva ao que é chamado de "bloat" - ou seja, a tabela ficará maior, mesmo que o número de registros permaneça o mesmo por causa dessas tuplas mortas.

    Do EnterpriseDB 2 , temos:

    • Quando um processo de vácuo é executado, o espaço ocupado por essas tuplas mortas é marcado como reutilizável por outras tuplas.

    Isso é semelhante à exclusão de um arquivo no sistema de arquivos - o espaço é meramente marcado como reutilizável e nada é realmente excluído. Isso não importa - o importante a notar é que o espaço ocupado pela linha fica disponível novamente para o servidor PostgreSQL para aquela tabela!

    A principal diferença entre VACUUMe VACUUM FULLé que com um VACUUM FULL, o espaço liberado também fica disponível para o sistema operacional! Isso pode ser útil se alguém desejar fazer um backup e estiver com pouco espaço em disco. A partir daqui :

    • Vacuum full retira um bloqueio exclusivo e reconstrói a tabela para que não tenha blocos vazios (vamos fingir que o fator de preenchimento é 100% por enquanto).

    Então, VACUUM FULLé análogo a desfragmentar um arquivo de disco (considere um arquivo de disco ≡ tabela PostgreSQL), do Percona 3 temos:

    VACUUM FULL é a opção padrão disponível com uma instalação do PostgreSQL que nos permite RECONSTRUIR uma tabela. [ênfase minha]

    No entanto, essa reconstrução exige um Access Exclusive Lock , que como o manual aponta:

    • ACESSO EXCLUSIVO

      Conflitos com bloqueios de todos os modos (ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE e ACCESS EXCLUSIVE). Esta modalidade garante que o titular é a única transação que acessa a mesa de alguma forma . [ênfase minha]

    Obviamente, e como você aponta, uma reescrita completa da tabela não é boa para a produção. O manual ainda diz:

    • Normalmente, isso só deve ser usado quando uma quantidade significativa de espaço precisa ser recuperada de dentro da tabela.

    Então, respondendo suas 2 perguntas:

    P. 1)

    o vácuo torna o espaço reutilizável para o novo inserto?

    Sim, mas ainda mais importante , não é necessário um bloqueio de acesso exclusivo. A partir da documentação , descobrimos que:

    Os trabalhadores do Autovacuum geralmente não bloqueiam outros comandos.

    Autovacuum é um VACUUMsem o FULLe normalmente é configurado no postgresql.confarquivo.

    VACUUMleva um bloqueio SHARE UPDATE EXCLUSIVE.

    Novamente, do manual :

    Este modo protege uma tabela contra alterações simultâneas de esquema e VACUUM executa.

    Ou como explicado por um colaborador experiente do PostgreSQL aqui :

    Autovacuum faz um bloqueio na tabela, mas é um bloqueio fraco que não interfere nas operações normais (SELECT, UPDATE, DELETE), mas interfere em coisas como adicionar índices ou truncar a tabela.

    O blog do EnterpriseDB mencionado acima fornece "Dicas de práticas recomendadas VACUUM and ANALYZE" - pessoalmente, eu normalmente aconselharia um ANALYZEafter a VACUUMpara atualizar as estatísticas da tabela para o otimizador! Este artigo também pode ajudá-lo com decisões sobre quando você pode querer correr VACUUM.

    P. 2)

    A pergunta feita no assunto.

    É possível nunca executar o vácuo completo no PostgreSQL

    Sim, é possível nunca executá-lo, especialmente se o espaço em disco não for uma preocupação. No entanto, pode valer a pena, pois uma reescrita completa da tabela (juntamente com os índices) pode ter um impacto benéfico no desempenho da consulta - registros em ordem física podem levar a menos páginas que exigem varreduras!

    Conclusão.

    Esta é uma questão complexa e um artigo completo seria impossivelmente longo, mas eu recomendo que você leia as referências aqui (e também as páginas aqui , aqui , aqui (fator de preenchimento) e aqui ).

    Claro, você não quer VACUUMinterromper seus sistemas de produção em horários de pico. Decidir sobre a melhor estratégia é o mesmo que praticamente tudo em TI - "It depends!".

    Há espaço em disco e parâmetros de carga de E/S a serem levados em consideração e você terá que chegar a um compromisso que melhor se adapte a todas as partes interessadas.

    1) o many9s é um excelente site para todas as coisas do PostgreSQL.
    2) O EnterpriseDB também é um excelente site e a maior empresa PostgreSQL com um grande número de membros e colaboradores da equipe principal.
    3) Percona, embora anteriormente uma empresa MySQL, agora também tem uma distribuição PostgreSQL, e eles patrocinam a promissora extensão pg_stat_monitor (veja também aqui ). Eles são altamente considerados.

    • 2
  2. Siva
    2022-07-27T23:15:06+08:002022-07-27T23:15:06+08:00

    Para superusuários, não podemos bloquear o vácuo completo e apenas o vácuo na mesa, não tornando o espaço reutilizável, temos que usar o vácuo completo para remover fisicamente a tupla morta.

    • -1

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