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 / 341007
Accepted
John Little
John Little
Asked: 2024-07-17 22:07:56 +0800 CST2024-07-17 22:07:56 +0800 CST 2024-07-17 22:07:56 +0800 CST

Postgres: existe uma maneira de acelerar a mudança do tipo de coluna de int4 para int8?

  • 772

Temos cerca de 100 alterações simples para fazer em nosso esquema de banco de dados, como esta:

alter table transactions alter customer_sport_id type bigint;

Antes era int4. A maioria das colunas alteradas possui um ou mais índices.

Cada um leva cerca de 30 a 45 minutos em uma poderosa instância RDS dedicada (db.r6i.4xlarge) sem outra carga.

Temos que confirmar após cada linha para evitar o uso de todo o armazenamento.

O problema é que é lento, levará dias para fazer as alterações e não podemos ficar inativos por tanto tempo.

Há algo que possamos fazer para acelerar isso? Por exemplo

  1. descartando índices e criando-os novamente depois? (isso aceleraria?)
  2. desabilitando o WAL? Não tenho certeza se isso é viável ou arriscado (por exemplo, o banco de dados pode ser corrompido se a migração falhar no meio do caminho)
  3. Criar uma nova tabela e, de alguma forma, copiar todos os dados antigos para a nova tabela (poderíamos fazer isso em SQL ou exigiria um procedimento armazenado?), eliminar a tabela antiga e criar as sequências e índices na nova tabela ?

Aparentemente, colocamos aspirador uma vez por semana.

Aqui estão as estatísticas de desempenho do banco de dados da última hora (você pode ver no lançamento do armazenamento que duas instruções foram concluídas):

insira a descrição da imagem aqui

postgresql
  • 2 2 respostas
  • 53 Views

2 respostas

  • Voted
  1. Best Answer
    bobflux
    2024-07-24T04:03:40+08:002024-07-24T04:03:40+08:00

    Se você estiver alterando várias colunas na mesma tabela, poderá fazer isso com um comando:

    ALTER TABLE foo ALTER col_a TYPE bigint, ALTER col_b TYPE bigint;
    

    Se precisar reconstruir a tabela, ainda terá que fazê-lo... o que também requer a reconstrução de todos os índices... mas só fará isso uma vez para todo o comando ALTER .

    Então se precisar alterar muitas colunas na mesma tabela, será muito mais rápido.

    descartando índices e criando-os novamente depois?

    Se você emitir muitos comandos ALTER e cada um deles exigir uma reconstrução de tabela, a eliminação dos índices evitará a reconstrução deles após cada comando. Mas é muito mais simples agrupar todas as suas alterações em um comando ALTER.

    desabilitando o WAL? Não tenho certeza se isso é viável ou arriscado (por exemplo, o banco de dados pode ser corrompido se a migração falhar no meio do caminho)

    Perigoso.

    Criando uma nova tabela e, em seguida, copiando todos os dados antigos para a nova tabela

    Sim, você pode fazer CREATE TABLE e depois INSERT INTO SELECT. Para obter melhor desempenho, você pode criá-lo UNLOGGED, para que não seja à prova de falhas durante a construção e, em seguida, alterne-o para LOGGED antes de colocar a tabela em produção.

    Se você deseja apenas alterar os tipos de colunas, isso quase não tem vantagens... No entanto, se a nova tabela for criada UNLOGGED, ela não gravará nenhum WAL ao preenchê-la, o que pode ajudar com seus problemas de espaço em disco. O principal uso para isso é se você quiser processar os dados com funções ou subconsultas dependentes: provavelmente será muito mais rápido usar um INSERT INTO SELECT que aplica seu processamento com funções e JOINs do que atualizar cada linha individualmente.

    • 1
  2. mustaccio
    2024-07-18T01:42:04+08:002024-07-18T01:42:04+08:00

    Alterar o tipo de dados da coluna de INT para BIGINT requer uma reescrita da tabela, que é principalmente E/S de disco, portanto, a única maneira de acelerá-la seria usar um armazenamento mais rápido.

    • 0

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