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 / 160760
Accepted
Hassan Baig
Hassan Baig
Asked: 2017-01-12 09:45:21 +0800 CST2017-01-12 09:45:21 +0800 CST 2017-01-12 09:45:21 +0800 CST

Liberando espaço em disco usando DELETE ou TRUNCATE?

  • 772

Mais de uma semana atrás, apaguei todas as linhas em uma tabela postgresql (não via truncate, em vez de delete from ...). Select count (*)revela que as linhas da tabela agora são 0.

Agora, quando executo consultas para consultar o espaço em disco, ainda vejo a tabela ocupando espaço. Especificamente, todos os índices ainda existem e estão ocupando espaço. Como faço para me livrar deles e liberar espaço em disco? Em segundo lugar, por que eles permanecem em primeiro lugar, quando me livrei de todas as linhas?


Aqui está a descrição detalhada da tabela em caso justificado:

                                      Table "public.links_photoobjectsubscription"
     Column     |           Type           |                                 Modifiers                                  
----------------+--------------------------+----------------------------------------------------------------------------
 id             | integer                  | not null default nextval('links_photoobjectsubscription_id_seq'::regclass)
 viewer_id      | integer                  | not null
 updated_at     | timestamp with time zone | not null
 seen           | boolean                  | not null
 type_of_object | character varying(15)    | not null
 which_photo_id | integer                  | 
 which_link_id  | integer                  | 
 which_group_id | integer                  | 
 which_salat_id | integer                  | 
Indexes:
    "links_photoobjectsubscription_pkey" PRIMARY KEY, btree (id)
    "links_photoobjectsubscription_seen" btree (seen)
    "links_photoobjectsubscription_updated_at" btree (updated_at)
    "links_photoobjectsubscription_viewer_id" btree (viewer_id)
    "links_photoobjectsubscription_which_photo_id" btree (which_photo_id)
Foreign-key constraints:
    "links_photoobjectsubscription_viewer_id_fkey" FOREIGN KEY (viewer_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED
    "links_photoobjectsubscription_which_photo_id_fkey" FOREIGN KEY (which_photo_id) REFERENCES links_photo(id) DEFERRABLE INITIALLY DEFERRED
    "which_group_id_photoobjectsubscription" FOREIGN KEY (which_group_id) REFERENCES links_group(id) ON DELETE CASCADE
    "which_link_id_photoobjectsubscription" FOREIGN KEY (which_link_id) REFERENCES links_link(id) ON DELETE CASCADE
    "which_salat_id_photoobjectsubscription" FOREIGN KEY (which_salat_id) REFERENCES links_salatinvite(id) ON DELETE CASCADE
postgresql delete
  • 1 1 respostas
  • 12549 Views

1 respostas

  • Voted
  1. Best Answer
    Evan Carroll
    2017-01-12T09:55:07+08:002017-01-12T09:55:07+08:00

    Dos documentos emVACUUM

    Existem duas variantes de VACUUM: VACUUM padrão e VACUUM FULL. VACUUM FULL pode recuperar mais espaço em disco, mas é executado muito mais lentamente. Além disso, a forma padrão do VACUUM pode ser executada em paralelo com as operações do banco de dados de produção. (Comandos como SELECT, INSERT, UPDATE e DELETE continuarão a funcionar normalmente, embora você não consiga modificar a definição de uma tabela com comandos como ALTER TABLE enquanto ela estiver sendo aspirada.) VACUUM FULL requer bloqueio exclusivo em a mesa em que está trabalhando e, portanto, não pode ser feito em paralelo com outro uso da mesa. Geralmente, portanto, os administradores devem se esforçar para usar o VACUUM padrão e evitar o VACUUM FULL.

    Você basicamente precisa emitir um comando para reescrever toda a tabela (do mesmo documento),

    Dica: O VACUUM simples pode não ser satisfatório quando uma tabela contém um grande número de versões de linhas inativas como resultado de atualização massiva ou atividade de exclusão. Se você tiver essa tabela e precisar recuperar o excesso de espaço em disco que ela ocupa, será necessário usar VACUUM FULL ou, alternativamente, CLUSTER ou uma das variantes de reescrita de tabela de ALTER TABLE. Esses comandos reescrevem uma nova cópia inteira da tabela e criam novos índices para ela. Todas essas opções requerem bloqueio exclusivo. Observe que eles também usam temporariamente espaço extra em disco aproximadamente igual ao tamanho da tabela, pois as cópias antigas da tabela e índices não podem ser liberadas até que as novas sejam concluídas.

    No mesmo documento,

    Dica: Se você tiver uma tabela cujo conteúdo inteiro é excluído periodicamente, considere fazer isso com TRUNCATE em vez de usar DELETE seguido de VACUUM. TRUNCATE remove todo o conteúdo da tabela imediatamente, sem exigir um VACUUM ou VACUUM FULL subseqüente para recuperar o espaço em disco agora não utilizado. A desvantagem é que a semântica estrita do MVCC é violada .

    E, a partir dos documentos emTRUNCATE

    TRUNCATE remove rapidamente todas as linhas de um conjunto de tabelas. Ele tem o mesmo efeito de um DELETE não qualificado em cada tabela, mas, como não verifica as tabelas, é mais rápido. Além disso, ele recupera espaço em disco imediatamente, em vez de exigir uma operação VACUUM subsequente. Isso é mais útil em tabelas grandes.

    • 10

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