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 / 75761
Accepted
Matthew
Matthew
Asked: 2014-09-05 18:39:03 +0800 CST2014-09-05 18:39:03 +0800 CST 2014-09-05 18:39:03 +0800 CST

Méritos de inserir na tabela temporária e renomear versus apenas adicionar/remover colunas

  • 772

Se eu adicionar ou descartar colunas de uma tabela do SQL Server, presumo que recebo divisões ou lacunas de página. Já que o tamanho da linha mudou.

Quando uso o RedGate SQL Compare para criar scripts de conversão, sua estratégia é criar uma tabela temporária, copiar todos os dados para essa tabela, descartar a tabela antiga e renomear a tabela temporária.

Presumo que isso limpe as páginas, pois todas as linhas foram inseridas "perfeitamente" sequencialmente.

Recentemente, um DBA me disse que essa abordagem de "copiar e renomear" é ineficiente, cara e desnecessária.

Quais são os méritos dessas duas abordagens?

sql-server-2008 best-practices
  • 2 2 respostas
  • 1193 Views

2 respostas

  • Voted
  1. Best Answer
    Remus Rusanu
    2014-09-05T23:15:14+08:002014-09-05T23:15:14+08:00

    Eu recomendo que você leia as colunas da tabela do SQL Server sob o capô . Você verá que muitas operações DDL de coluna resultam em colunas 'fantasmas' na tabela, colunas físicas que existem na tabela, mas não são visíveis para o usuário. Uma reconstrução removerá todas essas colunas fantasmas.

    Na maioria das vezes isso é benigno, mas existem algumas áreas escuras que podem levar aos problemas descritos em KB2504090 :

    Esse problema ocorre porque o acessador que o SQL Server usa para inserir dados em diferentes partições reconhece as alterações de metadados incorretamente. Quando os dados são inseridos na nova partição criada após a eliminação de uma coluna, o número máximo de colunas anuláveis ​​na nova partição pode ser um a menos que o número máximo de colunas anuláveis ​​na partição antiga.

    Eu, pelo menos, evito todas as ferramentas de comparação de esquema e implantação/atualizações baseadas em diferenças de comparação. Simplesmente não existe uma abordagem correta de tamanho único em relação à mudança de esquema. Assim como Henrik menciona, fui queimado pela 'cópia' da tabela de 500 GB, tyvm, sem mais diferenças para mim. Em vez disso, recomendo migrações, codificadas como scripts SQL e testadas em tamanho de dados relevantes antes de serem implantadas. Consulte Controle de versão e seu banco de dados . Rails ActiveRecord Migrations realmente entendem isso.

    • 3
  2. Henrik Staun Poulsen
    2014-09-05T22:32:33+08:002014-09-05T22:32:33+08:00

    Se sua alteração for apenas uma alteração de metadados, isso não afetará todas as linhas da tabela e não ocorrerá nenhuma divisão de página. Como em

    ALTER TABLE MyTable Add MyNewColumn varchar(50)
    

    Se não for apenas uma alteração de metadados (como em

    ALTER TABLE MyTable Add MyNewIntColumn NOT NULL DEFAULT (0)
    

    ), uma reconstrução de seu índice clusterizado fará uma "copiar e renomear" nos bastidores.

    Algumas de nossas tabelas têm 15 bilhões de linhas e leva de 15 a 20 horas para reconstruir o índice clusterizado. Eu uso a abordagem "copiar e renomear", quando não posso aceitar as 20 horas de inatividade aguardando a reconstrução. Primeiro, copio 14,99 bilhões de linhas, depois desabilito o trabalho que insere linhas, levo os 10 milhões de linhas restantes para a nova estrutura e, finalmente, uma renomeação.

    Sim, é um pouco caro (usando meu tempo), mas o sistema permanece online o maior tempo possível.

    Você reconstrói um índice como este:

    USE AdventureWorks2012;
    GO
    ALTER INDEX ALL ON HumanResources.Employee REBUILD;
    GO
    

    Isso pode ser programado, por isso é muito mais fácil do que "copiar e renomear".

    • 1

relate perguntas

  • Melhores práticas para conectar bancos de dados que estão em diferentes regiões geográficas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Downgrade do SQL Server 2008 para 2005

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