Skip to content

Softshop > Banco de Dados: Recompilar Índices SQL Server

Software: SOFTSHOP | Grupo: SOFTSHOP > ANALISE | Prioridade: ALTA

Solução

Requisitos:

Acesso ao SQL Server como usuário com permissões de administrador.

Observações:

Este procedimento pode levar de 1 a 15 minutos, dependendo do tamanho do banco de dados. É necessário ficar com banco de dados sem nenhum acesso.

Procedimento de Recompilação

1. Criar a procedure Recompila_Indices utilizando o script SQL abaixo:
1.1. Abra o SQL Server Management Studio (SSMS).
1.2. Conecte-se ao banco de dados do Softshop.
1.3. Crie uma nova consulta.

Imagem ilustrativa da criação da procedure

1.4. Cole o script SQL abaixo na consulta:
##### CREATE PROCEDURE [dbo].[Recompila_Indices]

##### AS

##### BEGIN

#####     SET NOCOUNT ON;

#####   


#####     DECLARE @PorcentagemMinimaFrag TINYINT = 50;

#####   


#####     IF OBJECT_ID('tempdb..#IndicesQueSeraoOrganizados') IS NOT NULL

#####         DROP TABLE #IndicesQueSeraoOrganizados;

#####   


#####     CREATE TABLE #IndicesQueSeraoOrganizados (

#####         NumeroLinha INT IDENTITY,

#####         TableName NVARCHAR(128),

#####         Query NVARCHAR(4000)

#####     );

#####   


#####     INSERT INTO #IndicesQueSeraoOrganizados (TableName, Query)

#####     SELECT

#####         OBJECT_NAME(B.object_id),

#####         'ALTER INDEX ' + QUOTENAME(B.name) + ' ON ' + QUOTENAME(OBJECT_SCHEMA_NAME(B.object_id)) + '.' + QUOTENAME(OBJECT_NAME(B.object_id)) + ' REBUILD;'

#####     FROM

#####         sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') A

#####     INNER JOIN

#####         sys.indexes B ON B.object_id = A.object_id AND B.index_id = A.index_id

#####     WHERE

#####         A.avg_fragmentation_in_percent >= @PorcentagemMinimaFrag

#####         AND OBJECT_NAME(B.object_id) NOT LIKE '[_]%'

#####         AND A.index_type_desc != 'HEAP'

#####     ORDER BY

#####         A.avg_fragmentation_in_percent DESC;

#####   


#####     DECLARE @Comando NVARCHAR(4000),

#####             @TableName NVARCHAR(128),

#####             @Loop INT;

#####   


#####     WHILE EXISTS (SELECT 1 FROM #IndicesQueSeraoOrganizados)

#####     BEGIN

#####         SELECT TOP 1

#####             @TableName = TableName,

#####             @Comando = Query,

#####             @Loop = NumeroLinha

#####         FROM

#####             #IndicesQueSeraoOrganizados

#####         ORDER BY

#####             NumeroLinha;

#####   


#####         PRINT 'Rebuilding index for table: ' + ISNULL(@TableName, 'UNKNOWN');

#####   


#####         BEGIN TRY

#####             EXEC sp_executesql @Comando;

#####             PRINT 'Index for table ' + ISNULL(@TableName, 'UNKNOWN') + ' rebuilt successfully.';

#####         END TRY

#####         BEGIN CATCH

#####             PRINT 'Error rebuilding index: ' + ISNULL(@TableName, 'UNKNOWN') + ' - ' + ERROR_MESSAGE();

#####         END CATCH;

#####   


#####         DELETE FROM #IndicesQueSeraoOrganizados WHERE NumeroLinha = @Loop;

#####     END

##### END

##### GO
2. Pedir para o cliente fechar o sistema Softshop.
Importante!
Certifique-se de que nenhum usuário esteja acessando o banco de dados durante a recompilação para evitar erros e perda de dados.
3. Reinicie o serviço do SQL Server.
4. Execute a procedure Recompila_Indices no SSMS.

Imagem ilustrativa da execução da procedure

4.1. No SSMS, navegue até Programação > Procedimentos Armazenados.

Imagem ilustrativa da localização da procedure

4.2. Localize a procedure Recompila_Indices e clique com o botão direito para executá-la.

Imagem ilustrativa da execução do procedimento armazenado

Como Solicitar a Revisão ou Criação de FAQs?

Acesse o fluxo de aprovação FAQ 6729 - Softcom > FAQ: Como se dará o fluxo (Diagrama) de renovação da base de conhecimento? (Clique aqui)


Tags: recompila indice, recompilar indices, sql recompilar

Documentação de Testes