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 / 4506
Accepted
sh-beta
sh-beta
Asked: 2011-08-10 10:35:02 +0800 CST2011-08-10 10:35:02 +0800 CST 2011-08-10 10:35:02 +0800 CST

Adicionando colunas a tabelas de produção

  • 772

Qual é a melhor maneira de adicionar colunas a grandes tabelas de produção no SQL Server 2008 R2? De acordo com os livros online da Microsoft:

As alterações especificadas em ALTER TABLE são implementadas imediatamente. Se as alterações exigirem modificações nas linhas da tabela, ALTER TABLE atualizará as linhas. ALTER TABLE adquire um bloqueio de modificação de esquema na tabela para garantir que nenhuma outra conexão faça referência até mesmo aos metadados da tabela durante a alteração, exceto operações de índice online que exigem um bloqueio SCH-M muito curto no final.

(http://msdn.microsoft.com/en-us/library/ms190273.aspx)

Em uma tabela grande com milhões de linhas, isso pode demorar um pouco. Fazer uma interrupção é a única opção? Qual é a melhor maneira de lidar com esse tipo de situação?

sql-server sql-server-2008-r2
  • 4 4 respostas
  • 30419 Views

4 respostas

  • Voted
  1. Best Answer
    gbn
    2011-08-10T11:38:43+08:002011-08-10T11:38:43+08:00

    "Depende"

    Se você adicionar uma coluna que não requer a adição de dados às linhas, isso pode ser bastante rápido.

    Por exemplo, adicionar um int ou char requer movimentos físicos de linha. Adicionar um varchar anulável sem padrão não deveria (a menos que o bitmap NULL precise expandir)

    Você precisa experimentá-lo em uma cópia restaurada da produção para obter uma estimativa

    Criar uma nova tabela, copiar, renomear pode demorar mais se você precisar adicionar novamente índices e chaves em uma tabela de bilhões de linhas.

    Eu alterei bilhões de tabelas de linhas que levaram alguns segundos para adicionar uma coluna anulável.

    Eu disse para fazer um backup primeiro?

    • 27
  2. Aaron Bertrand
    2011-08-11T04:43:13+08:002011-08-11T04:43:13+08:00

    Se a coluna for NULLable, o impacto deve ser insignificante. Se a coluna não pode ser NULL e o valor deve ser definido, então pode ser bem diferente. O que eu faria neste caso é, em vez de adicionar uma restrição não nula e padrão de uma só vez, efetivamente adicionando dados a cada linha:

    • adicione a coluna como NULLable - deve ser rápido na maioria dos casos
    • atualize os valores para o padrão
      • você pode fazer isso em lotes, se necessário
      • você também pode usar isso para aplicar lógica condicional onde algumas linhas podem não obter o padrão
    • adicione as restrições não nulas/padrão
      • isso será mais rápido quando nenhum dos dados for NULL, mas ainda deve ser mensurável

    Concordo com @gbn que você pode testar isso restaurando uma cópia da produção e testando lá ... você terá uma boa ideia do tempo (supondo que o hardware seja um pouco semelhante) e também poderá ver o impacto no log de transações.

    • 21
  3. RobPaller
    2011-08-10T11:03:02+08:002011-08-10T11:03:02+08:00

    Você considerou:

    1. Criando uma nova tabela que inclui as mudanças na definição da tabela.
    2. Inserindo na nova definição de tabela selecionando da tabela original.
    3. Renomear a tabela original para _orig e, em seguida, renomear a nova tabela para o nome da tabela original.

    A desvantagem aqui é que você precisa ter espaço suficiente no banco de dados para fazer essa alteração. Você ainda pode exigir um bloqueio de leitura na mesa para evitar leituras sujas.

    No entanto, você minimiza o impacto para os usuários finais se houver uma chance ou necessidade de a tabela original ser acessada simultaneamente. Também deve minimizar as durações de bloqueio.

    • 4
  4. rince
    2020-01-15T14:19:36+08:002020-01-15T14:19:36+08:00

    Tenho uma exceção especial que acho que deveria ser mencionada.

    Com o SQL Server 2012 Enterprise e mais recente, adicionar uma nova coluna NOT NULL com uma constante de tempo de execução é uma operação online que é concluída instantaneamente e não depende do número de linhas na tabela.

    Mais informações sobre isso são encontradas no MSDN

    Vou reproduzir a seção importante

    A partir do SQL Server 2012 (11.x) Enterprise Edition, adicionar uma coluna NOT NULL com um valor padrão é uma operação online quando o valor padrão é uma constante de tempo de execução. Isso significa que a operação é concluída quase instantaneamente, apesar do número de linhas na tabela. Porque as linhas existentes na tabela não são atualizadas durante a operação. Em vez disso, o valor padrão é armazenado apenas nos metadados da tabela e o valor é pesquisado, conforme necessário, em consultas que acessam essas linhas.

    • 2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

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

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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