Compartilhar via

Bloqueio Sessões ao Realizar Alter Table

Tatiana Jandira 415 Pontos de reputação
2024-10-03T13:45:30.03+00:00

Bom Dia.

Nos estamos tentando realizar um Alter table em uma table em uma tabela com 42.972.157 registros.

Esse alter table irá adicionar uma nova tabela.

Porém esse alter table está sendo bloqueada por outras sessões provenientes da aplicação, especificamente consultas. Teria alguma forma dessas consultas ou sessões não causarem bloqueio nesse alter ? Ou usando with(nolock) nas consultas liberaria a sessão para o alter ?

E no caso de updates ou inserts, como faria para eles não bloquearem esse Alter ?

SQL Server | Outro
0 comentários Sem comentários
{count} votos

Resposta aceita
  1. Jonathan Pereira Castillo 17,095 Pontos de reputação Equipe Externa da Microsoft Moderador
    2024-10-04T15:48:12.27+00:00

    Olá Tatiana Jandira!

    Bem-vindo ao Microsoft Q&A!

    Entendo que você está enfrentando bloqueios ao tentar realizar um ALTER TABLE em uma tabela com muitos registros. Aqui estão algumas sugestões para minimizar ou evitar esses bloqueios:

    1. Uso de WITH (NOLOCK)

    Adicionar WITH (NOLOCK) nas consultas pode ajudar a evitar bloqueios de leitura, mas é importante notar que isso pode resultar em leituras sujas (dirty reads), onde os dados podem não estar consistentes. Use com cautela:

    SQL

    SELECT * FROM sua_tabela WITH (NOLOCK);
    
    1. Realizar o ALTER TABLE em Horários de Baixa Atividade

    Tente realizar o ALTER TABLE durante períodos de baixa atividade no banco de dados para minimizar o impacto nas sessões ativas.

    1. Dividir a Alteração em Passos Menores

    Se possível, divida a alteração em passos menores para reduzir o tempo de bloqueio. Por exemplo, se você está adicionando várias colunas, adicione uma coluna de cada vez.

    1. Utilizar Transações

    Envolva o ALTER TABLE em uma transação para garantir que ele seja executado de forma atômica e para poder reverter em caso de falha:

    SQL

    BEGIN TRANSACTION;
    ALTER TABLE sua_tabela ADD nova_coluna INT;
    COMMIT;
    
    1. Verificar e Ajustar os Níveis de Isolamento

    Ajuste os níveis de isolamento das transações para reduzir a contenção de bloqueios. Por exemplo, o nível de isolamento READ COMMITTED SNAPSHOT pode ajudar a reduzir bloqueios de leitura.

    1. Utilizar Ferramentas de Monitoramento

    Use ferramentas de monitoramento para identificar e resolver bloqueios. No SQL Server, por exemplo, você pode usar a DMV sys.dm_tran_locks para monitorar bloqueios:

    SQL

    SELECT * FROM sys.dm_tran_locks;
    
    1. Considerar o Uso de Particionamento

    Se a tabela é muito grande, considere particioná-la. Isso pode ajudar a reduzir o impacto de operações de alteração na tabela.

    1. Consultas de Atualização e Inserção

    Para UPDATE e INSERT, considere usar transações menores e mais frequentes para reduzir o tempo de bloqueio. Além disso, certifique-se de que os índices estão otimizados para essas operações.

    Espero que essas dicas ajudem a resolver o problema! Se precisar de mais assistência, estou à disposição.

    Saudações

    Jonathan.

    -----------

    Sua opinião é muito importante para nós! Se esta resposta resolveu sua consulta, por favor clique em ‘YES‘. Isso nos ajuda a melhorar continuamente a qualidade e relevância de nossas soluções. Obrigado pela sua colaboração!

    1 pessoa achou esta resposta útil.
    0 comentários Sem comentários

2 respostas adicionais

Classificar por: Mais útil
  1. Tatiana Jandira 415 Pontos de reputação
    2024-10-11T11:40:16.6866667+00:00

    Muito Obrigada Jonathan.

    Voce sempre com respostas sempre acertivas.

    1 pessoa achou esta resposta útil.
    0 comentários Sem comentários

  2. Jonathan Pereira Castillo 17,095 Pontos de reputação Equipe Externa da Microsoft Moderador
    2024-10-16T18:47:37.33+00:00

    Obrigada Tatiana, é sempre um prazer ajudá-la

    Jonathan

    0 comentários Sem comentários

Sua resposta

As respostas podem ser marcadas como Respostas Aceitas pelo autor da pergunta, o que ajuda os usuários a saber a resposta que resolveu o problema do autor.