TOTVS Protheus - Analisando e eliminando sujeira do banco de dados Protheus



No ERP Protheus assim como em qualquer outra aplicação, podem existir processos automáticos que ao serem executados criam diversos tipos de objetos no banco de dados, como por exemplo tabelas temporárias, stored procedures temporárias, geração de registros de logs etc. Isso é algo absolutamente normal, desde que o sistema faça de forma automática a limpeza daquilo que é considerado temporário. Mas nem sempre é assim, podem haver falhas ou não, e por diversas razões esses objetos temporários podem estar se acumulando em sua base de dados.

Neste artigo iremos analisar quatro situações que podem estar consumindo espaço desnecessária em seu banco de dados, e dependendo do ponto de vista do leitor isso pode ser considerado sujeira ou talvez não. 


Analisando as tabelas temporárias SP

Vamos começar consultando as tabelas de catálogo do SQL Server através do script da lista 1 e verificar quais tabelas não possuem uma nomenclatura padrão (TTTEEE). Iremos buscar pelas tabelas que tem a sigla SP, que armazenam dados temporários e que são carregados a partir da execução de stored procedure padrão do ERP Protheus. 


	-- Analisando espaço em disco consumido pelas tabelas temporárias SP
	select 
		tab.name as Tabela,
		par.rows as 'Quantidade de Linhas',
		SUM(alu.total_pages) * 8 / 1000 AS 'Espaco em MB'
	from sys.schemas as sch, sys.tables as tab, sys.indexes ind, 
	sys.partitions as par ,sys.allocation_units as alu 
	where
		sch.schema_id = tab.schema_id
	and tab.object_id = ind.object_id
	and sch.schema_id = 1 -- dbo
	and ind.object_id = par.object_id
	and ind.index_id = par.index_id
	and par.partition_id = alu.container_id
	and LEN(tab.name) > 6 AND tab.name LIKE '%SP'
	group by tab.name, par.rows 
	order by 'Espaco em MB' desc, Tabela

LISTA 1 Script para verificar quantidade de linhas e consumo de espaço


Veja a seguir que localizamos 33 tabelas temporárias. 


Tabela               Linhas               Espaco em MB
-------------------- -------------------- --------------------
TRW010_SP            681825               1104
TRB01SP              159160               145
TRB40SP              2660                 5
TRW400_SP            1857                 3
TRB010_SP            0                    1
TRW060_SP            383                  1
TRA010_SP            0                    0
TRA01SP              0                    0
TRA40SP              0                    0
TRA900_SP            0                    0
TRB900_SP            0                    0
TRC010_SP            0                    0
TRC01SP              0                    0
TRC400_SP            0                    0
TRC40SP              0                    0
TRD010_SP            11                   0
TRD01SP              11                   0
TRD40SP              1                    0
TRD900_SP            0                    0
TRJ010_SP            0                    0
TRJ400_SP            0                    0
TRK010_SP            0                    0
TRK400_SP            0                    0
TRT010_SP            0                    0
TRT01SP              0                    0
TRT40SP              0                    0
TRT900_SP            0                    0
TRW900_SP            0                    0
TRW910_SP            0                    0
TRX010_SP            308                  0
TRX01SP              734                  0
TRX40SP              96                   0
TRX900_SP            0                    0

(33 rows affected)
LISTA 2 Resultado com a lista de tabelas temporárias SP


A primeira tabela da lista 2, a TRW010_SP, chama bastante atenção pois no prazo de aproximadamente 8 meses já tem acumulado mais de 1GB de dados temporárias. Quase parecido com período de gestação, não é mesmo? rsrs

Observe logo abaixo os scripts das listas 3 e 4. Eles mostram que por algum motivo não houve a limpeza de forma automática, pelo menos até o momento em que escrevo este artigo. Inclusive a versão do Protheus utilizada neste teste foi a 12.1.25. 


	-- Verificando período inicial e final dos dados temporários

	SELECT MIN(CT2_DATA) MenorData, MAX(CT2_DATA) MaiorData FROM TRW010_SP

LISTA 3 Script verificando o período dos dados acumulados 


MenorData MaiorData
--------- ---------
20200201  20201027

(1 row affected)

LISTA 4 Resultado mostrando o período existente - de 01/02/20 até 27/10/20


Em resumo tabela TRW010_SP é usada por uma stored procedure quando ocorre as atualizações nos saldos contábeis, por isso ela carrega o conteúdo da tabela CT2.

E a tabela TRB01SP é atualizada a cada execução do recálculo do custo médio, ela mostra como os produtos foram ordenados ao executar a rotina.

O resultado dessa primeira análise nos mostra um pouco mais de 1GB de espaço usado para guardar apenas dados temporários. Vale ressaltar que esses dados são referente a um período de apenas 8 meses. Imagine o resultado caso nunca tenha executado um processo limpeza. No próximo tópico vamos analisar outras tabelas.


Analisando as tabelas temporárias H_ e H010_

Aqui temos mais um conjunto de tabelas temporárias que são gerados por rotinas do módulo estoque (H) e fiscal (H010), mas nem sempre são limpadas de forma automática. No entanto observei que os dados não se acumulam, diferente da situação mostrada anteriormente. O total de espaço acumulado por estes dados não foi nada significativo, porém ficam apenas poluindo o banco, caso queira considerar assim.


Tabela               Linhas               Espaco em MB
-------------------- -------------------- --------------------
H_2018123101_01      1                    0
H_2018123101_03      60                   0
H_2018123101_08      1                    0
H_2018123101_09      70                   0
H_2018123101_12      54                   0
H_2018123101_13      40                   0
H_2018123101_14      18                   0
H_2019123101_01      1                    0
H_2019123101_03      61                   0
H_2019123101_08      150                  0
H_2019123101_09      79                   0
H_2019123101_12      50                   0
H_2019123101_13      39                   0
H_2019123101_14      19                   0
H010_SC016200        142                  0
H010_SC065010        54                   0
H010_SC742720        40                   0
H010_SC755320        142                  0
H010_SC759910        427                  0
H010_SC808630        60                   0
H010_SC814970        94                   0
H010_SC815760        1                    0
H010_SC816640        1                    0
H010_SCARVKR0        1                    0
H010_SCAUM110        70                   0
H010_SCBATT30        39                   0
H010_SCBATWG0        39                   0
H010_SCBBAMM0        132                  0
H010_SCBBBJ50        132                  0
H010_SCBBDDS0        61                   0
H010_SCBBZCR0        50                   0
H010_SCBHCGQ0        19                   0
H010_SCBHEZP0        79                   0
H010_SCBIKUV0        421                  0

(34 rows affected)

LISTA 5: Tabelas temporárias H e H010_


As tabelas com a nomenclatura H010_ podem ser um problema pois a cada execução é gerado uma nova tabela que vai se acumulando no banco.


Analisando a tabela CTK

A tabela CTK é bastante conhecida e também documentada no TDN. Essa tabela armazena dados de forma redundante quando a rotina de contabilização é executada.

A tabela oficial que armazena os dados de contabilização é a CT2. No entanto quando o usuário executa a rotina de contabilização, o sistema gera uma cópia inicial de cada registro na tabela CTK (Contra prova) e depois envia para CT2. 

A tabela CT2 é uma das maiores tabelas do banco de dados Protheus pelo fato consolidar todas as movimentações contábeis (vendas, compras, estoque, financeiro, folha e etc.)  de uma organização.

Se a sua tabela CT2 possui por exemplo 400GB, então simplesmente multiplique por dois. Na verdade você possui é 800GB.

Segundo a própria TOTVS os registros da tabela CTK podem ser totalmente excluídos após efetivação dos lançamentos conforme informado neste link.

Portanto deve-se analisar se realmente é necessário manter os dados na CTK.


Analisando tabelas com registros D_E_L_E_T_ = '*'

Já parou para analisar quantos registros deletados você tem na CT2? É sempre importante analisar também este ponto e verificar primeiramente se é realmente necessário manter o histórico de registros deletados. Se sua empresa utiliza para fins de auditoria ou algum tipo de análise estatística, então não a nada o que se fazer.

Entretanto é importante determinar quais tabelas podem passar por um processo de limpeza dos registros d_e_l_e_t_ = '*', pois nem todas as tabelas podem fazer  sentido manter esses registros.

A quem diz que em banco de dados nada pode ser excluído. Mas imagine que o usuário configurou um lançamento padrão (LP) e após contabilizar 10 lançamentos de forma automática descobriu que o histórico estava errado, em seguida alterou a LP, excluiu os lançamentos e refez os lançamentos com o histórico correto. Nesse cenário o sistema manteve 20 registros, porém 10 registros com o status de excluído. Aí vem a pergunta, até que ponto deve-se manter esses registros e por que? Novamente a reposta é simples, depende, pois não existe certo e nem errado.

Na verdade vai depender do seu cenário, se é necessário então mantenha os dados, caso contrário pode-se criar rotinas automáticas em seu SGBD para fazer a limpeza deixando por exemplo apenas os últimos 3 meses.


Considerações

Um dos objetivos aqui foi apenas abordar questões referente ao armazenamento de dados temporários gerados por rotinas padrões do ERP Protheus. Vimos que algumas tabelas em um curto espaço de tempo superam a marca de 1GB de espaço em disco e essa situação varia de empresa para empresa.

De forma geral a eliminação de dados temporários pode significar uma redução considerável de espaço. Mas cada empresa pode tratar essas questões de forma diferente. 

O título deste artigo pode parecer polêmico, entretanto foi analisado apenas alguns detalhes sobre o assunto e conforme já mencionei não existe certo ou errado. O importante é analisar e questionar determinadas situações e compreender os motivos, muitas vezes você esta guardando dados temporários devido a erros de software. Por essa razão considero importante este tipo de análise. 

Deixe seu comentário e até a próxima!



Comentários