Script para ver quantos registros deletados existem e fazer a limpeza

No artigo de hoje, vamos demonstrar em como consultar quantos registros estão marcados como excluídos no Protheus.

Essa dica foi enviada pelo grande Súlivan Simões ( LinkedIn ).

Caso você já precisou identificar quantos registros estão excluídos por tabela, o grande Súlivan criou um script para SQL Server que demonstra exatamente isso, conforme print abaixo:

Exemplo de execução do script

Além do mais, é feito uma excelente explicação sobre o assunto no LinkedIn, vou deixar aqui o link de referência para leitura: Performance Protheus – Manutenção no banco de dados SQL Server

Abaixo o Script, que também esta disponível para download no GitHub: Clique aqui

use NomeDaSuaBase

DECLARE @Contador int = 0;
DECLARE @QuantidadeTabelas int
DECLARE @NomeTabela nvarchar(500) ;
DECLARE @Linhas  int;
DECLARE @Query nvarchar(max) = '';
DECLARE @QueryAux nvarchar(max) = '';

DECLARE TodasTabelas cursor for
SELECT SUM(partitions.rows) AS '@Linhas',
	   dbtables.name AS 'tabela'
FROM sys.tables AS dbtables
JOIN sys.partitions AS partitions ON dbtables.object_id = partitions.object_id AND partitions.index_id in (0,1)
WHERE dbtables.[name]  NOT LIKE '%TOP_%'
GROUP BY schema_name(schema_id), dbtables.name
HAVING SUM(partitions.rows) > 0

--Obtendo quantas tabelas que possuem dados
SET @QuantidadeTabelas = (  SELECT MAX(LINHA) FROM( SELECT  ROW_NUMBER() OVER(ORDER BY dbtables.name DESC) AS LINHA
					  							    FROM sys.tables AS dbtables
												    JOIN sys.partitions AS partitions ON dbtables.object_id = partitions.object_id AND partitions.index_id in (0,1)
												    WHERE dbtables.[name]  NOT LIKE '%TOP_%'
												    GROUP BY schema_name(schema_id), dbtables.name
												    HAVING SUM(partitions.rows) > 0 ) AS TMP )												

OPEN TodasTabelas 
FETCH NEXT FROM TodasTabelas  
INTO @Linhas, @NomeTabela

PRINT 'Processo iniciado';
PRINT 'Analisando '+CAST(@QuantidadeTabelas AS NVARCHAR(50)) +' tabelas';

WHILE @contador < @QuantidadeTabelas
	BEGIN 

		SET @QueryAux = ' SELECT Tabela,'
					  +			' Deletados,'
					  +			' Nao_deletados,'
					  +			' CASE' 
					  +				' WHEN Nao_deletados > 0 THEN ( CAST( CAST(Deletados AS FLOAT) / CAST(Nao_deletados AS FLOAT) * 100 AS INT)) '
					  +				' ELSE 0 '
					  +			' END AS ''% Registros Deletados'''
					  + ' FROM ( ' 
					  + ' SELECT '
					  +          ''''+@NomeTabela+''' AS Tabela,'
					  +		   ' COUNT(*) AS Deletados, '
					  +        ' ( SELECT COUNT(*) FROM '+ @NomeTabela +' WHERE ' + @NomeTabela + '.D_E_L_E_T_ = '''' ) AS Nao_deletados '					  
				      + ' FROM ' + @NomeTabela 
				      + ' WHERE ' + @NomeTabela + '.D_E_L_E_T_ = ''*'' '
					  + ') AS TMP'
					  + ' GROUP BY Tabela, Deletados, Nao_deletados'
					  + CHAR(13)+CHAR(10)

		IF @contador < @QuantidadeTabelas -1
			BEGIN				
				SET @QueryAux += ' UNION ALL'
			END

		PRINT CHAR(13)+CHAR(10) + @QueryAux 

		SET @Query += @QueryAux

		SET @contador += 1;

		FETCH NEXT FROM TodasTabelas  
		INTO @Linhas, @NomeTabela
	END

-- Ordena as tabelas que tem mais registros deletados primeiro
SET @Query += ' ORDER BY Deletados DESC'

-- Executa a query que foi construída
EXEC( @Query )

CLOSE TodasTabelas 
DEALLOCATE TodasTabelas

PRINT 'Processo concluído';
GO

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