O que pode causar lentidão e travamentos em operações que envolvam a tabela SB2

No artigo de hoje, vamos abordar sobre algumas situações que podem causar travamentos na tabela SB2.

Recentemente em um cliente pegamos uma situação, onde a SB2 estava lenta, onde ao tentar fazer apontamentos de produção, com dois usuários ou mais ao mesmo tempo, ocasionava travamentos.

Ao tentar rastrear via banco de dados, o comportamento era devido a trigger pra atualizar o campo S_T_A_M_P_.

Esse campo, ele grava a data e hora, toda vez que um registro é atualizado, e isso pra uma tabela de saldos é complicado pois para a SB2 imagina:

  • Saldo entrando via documento de entrada
  • Saldo saindo via documento de saída
  • Reservas e Previsões sendo populadas via pedido de compras, solicitação de compras, pedidos de venda
  • Consumos de Estoque via processos produtivos
  • Entre outros

Mas aí que está, por padrão, a tabela SB2 por ser de saldos, ela não tem esse campo ativado por padrão, então pode ser que para o cenário do cliente, ativaram o campo.

E para sanar essa questão?

Bom, teria duas formas, a primeira é desativar a trigger de atualização, a segunda é mais agressiva, apagando a tabela e recriando, então vamos para as duas forma.

Forma 1 – Desativando a Trigger

1. Pare o DbAccess

2. Abra o sistema gerenciador de Banco de Dados

3. Vá na tabela em questão (nesse exemplo, vamos usar a SC5990, da nossa base local que tem essa trigger habilitada)

4. Vá em Triggers ou Gatilhos, vai ter o nome da tabela, em seguida “_STAMP”

Achando Gatilhos no Management Studio
Achando Gatilhos no Management Studio

5. Clique com o botão direito em cima desse gatilho, e depois clique em Desabilitar

Opção de Desabilitar
Opção de Desabilitar

6. Depois vai mostrar uma mensagem de sucesso, e o ícone do gatilho vai ficar com um X vermelho

Mensagem de êxito
Mensagem de êxito

7. Inicie o DbAccess

Forma 2 – Apagando a tabela e recriando

Obs.: Essa forma é mais agressiva, faça primeiro em base de testes

Obs. 2: Só faça essa forma, se a primeira não tiver dado certo ou você não tiver acesso ao gerenciador do Banco de Dados (como em um ambiente de nuvem)

1. Deixe tudo em modo exclusivo, para usuários não acessarem o sistema

2. Acesse o APSDU, vá na tabela SX2

3. Filtre por SB2, no campo X2_STAMP, deixe como “2” (1=Sim;2=Não)

4. Com o APSDU aberto ainda, abra a tabela SB2 e faça um backup dela

5. Após o backup criado (certifique-se de que esteja funcional o backup), dê um drop table na SB2

6. Pare todos os serviços, incluindo o DbAccess

7. Suba os serviços, mas ainda deixe o acesso exclusivo

8. Abra o Protheus, e faça o sistema recriar a tabela SB2 (vá no cadastro de produtos, posicione em qualquer produto e aperte -F4-)

9. Depois de recriar a SB2, vá no APSDU, e dê um append from, voltando os dados do backup criado no passo 5

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação