Close Menu
Código Simples .NETCódigo Simples .NET
    Facebook X (Twitter) Instagram
    Trending
    • NewSQL em 2025: O Estado Atual, Tendências e o Futuro dos Bancos de Dados Relacionais Escaláveis
    • 12 Regras Essenciais para Reduzir a Latência de Aplicações
    • Cache Hit Ratio: Como uma Simples Métrica Pode Revolucionar sua Arquitetura
    • Como a Uber calcula o tempo estimado de chegada
    • 30 APIs Gratuitas para desenvolvedores
    • Por que escalar escrita é tão mais difícil do que escalar leitura?
    • MongoDB Analyzer para .NET: Visualize e otimize suas consultas de forma simples
    • Cardinalidade: O Conceito que Transforma o Desempenho de Bancos de Dados SQL e NoSQL
    Facebook X (Twitter) Instagram
    Código Simples .NETCódigo Simples .NET
    Código Simples .NETCódigo Simples .NET
    Home»Banco de dados»Sql»Como verificar e resolver a fragmentação de índices no SQL Server

    Como verificar e resolver a fragmentação de índices no SQL Server

    Jhonathan SoaresBy Jhonathan Soares13 de novembro de 20182 Mins Read Sql
    Share
    Facebook Twitter LinkedIn WhatsApp Copy Link

    Quando um banco de dados é atualizado com frequência por meio de instruções INSERT, UPDATE ou DELETE, podemos esperar que ele se torne fragmentado ao longo do tempo.
    Se os índices do banco de dados estiverem fragmentados, o otimizador de consultas do SQL Server poderá escolher um plano de execução não ideal ao usar um índice para resolver uma consulta.
    Isso afetará o desempenho geral da consulta e você poderá observar uma consulta se comportando mais lentamente do que o normal, existe casos em que uma consulta pode levar mais de 500% do tempo por causa de um plano de execução errado através de índice fragmentado.

    Resolução
    * Aviso: Podem ocorrer danos irreversíveis ao banco de dados. Esse procedimento deve ser executado apenas por usuários familiarizados com o SQL Server Management Studio. Deve-se fazer o backup dos bancos de dados antes de executar este procedimento. *

    A seguir, uma consulta simples que listará todos os índices em todas as tabelas do banco de dados, ordenadas por porcentagem de fragmentação do índice, perceba que a query poderá levar alguns minutos para executar dependendo da quantidade de índices e a fragmentação dos mesmos:

     SELECT dbschemas.[name] as 'Schema',
    dbtables.[name] as 'Table',
    dbindexes.[name] as 'Index',
    indexstats.avg_fragmentation_in_percent,
    indexstats.page_count
    FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
    INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
    INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
    INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
    AND indexstats.index_id = dbindexes.index_id
    WHERE indexstats.database_id = DB_ID()
    ORDER BY indexstats.avg_fragmentation_in_percent desc
    
    -- adicionar clausula para buscar uma tabela em específico
    -- WHERE indexstats.database_id = DB_ID() AND dbtables.[ name ] like '%%' 

     

    Para reduzir a fragmentação, teremos que reorganizar ou reconstruir os índices. Escolher entre reorganizar (reorganize) ou reconstruir (rebuild) depende dos resultados da consulta. Para índices altamente fragmentados, é necessário um processo de reconstrução, caso contrário, a reorganização do índice deve ser suficiente.

    A seguinte tabela indica as recomendações da Microsoft sobre rebuild e reorganize:
    Fragmentação (em %) Ação  Query
    avg_fragmentation_in_percent > 5 AND < 30  Reorganize Index  ALTER INDEX REORGANIZE
    avg_fragmentation_in_percent > 30  Rebuild Index ALTER INDEX REBUILD WITH (ONLINE = ON)

    A recompilação de um índice pode ser executada online ou offline. A reorganização de um índice sempre é executada online. Para atingir disponibilidade semelhante à opção de reorganização, recrie índices online. Veja o exemplo:

    --reorganizar um índice específico
    ALTER INDEX IX_NAME
      ON dbo.Employee  
    REORGANIZE ;   
    GO  
    
    -- reorganizar todos os índices de uma tabela
    ALTER INDEX ALL ON dbo.Employee  
    REORGANIZE ;   
    GO  
    
    -- rebuild de um índice específico
    ALTER INDEX PK_Employee_BusinessEntityID ON dbo.Employee
    REBUILD;
    
    -- rebuild de todos índice de uma tabela
    ALTER INDEX ALL ON dbo.Employee
    REBUILD;
    

     

    Lembre-se que o comando rebuild por padrão gera lock na tabela e leva bem mais tempo do que o reorganize. Por isto tenha cuidado ao realizar estas operações dentro do horário produtivo do seu software.

    Fonte: https://docs.microsoft.com/pt-br/sql/relational-databases/indexes/reorganize-and-rebuild-indexes?view=sql-server-2017

    Um grande abraço a todos!

    Share. Facebook Twitter LinkedIn Telegram WhatsApp Copy Link
    Jhonathan Soares
    • Website
    • Facebook
    • X (Twitter)
    • LinkedIn

    Criador do blog Código Simples e com mais 15 anos de experiência em TI, com títulos de MVP Microsoft na área de Visual Studio Development, Neo4j Top 50 Certificate, Scrum Master e MongoDB Evangelist.

    Posts Relacionados

    Cardinalidade: O Conceito que Transforma o Desempenho de Bancos de Dados SQL e NoSQL

    NoSql Sql 14 de janeiro de 20257 Mins Read

    Entendendo os diferentes tipos de locks em bancos de dados e como evitá-los

    NoSql Sql 2 de julho de 20248 Mins Read

    Happy Hour com Dados #14 – Modelagem de Dados

    Dicas NoSql Sql 22 de setembro de 20201 Min Read
    Newsletter

    Digite seu endereço de e-mail para receber notificações de novas publicações por e-mail.

    Junte-se a 25mil outros assinantes
    Posts recentes
    • NewSQL em 2025: O Estado Atual, Tendências e o Futuro dos Bancos de Dados Relacionais Escaláveis
    • 12 Regras Essenciais para Reduzir a Latência de Aplicações
    • Cache Hit Ratio: Como uma Simples Métrica Pode Revolucionar sua Arquitetura
    • Como a Uber calcula o tempo estimado de chegada
    • 30 APIs Gratuitas para desenvolvedores
    Categorias
    • Arquitetura (14)
      • Testes (2)
    • Asp.net (120)
      • C# (89)
      • Mvc (13)
    • Banco de dados (90)
      • NoSql (58)
      • Sql (38)
    • Boas práticas (29)
      • Gestão & Produtividade (1)
      • Metodologias Ágeis (6)
    • Cursos (52)
    • Dicas (105)
    • Front-End (92)
    • IA (1)
    • Linux (6)
    • NodeJS (4)
    • Post do Leitor (9)
    • Python (5)
    • Seo (12)
    • Tecnologia (30)
      • ITIL (1)
      • Padrões de Projeto (4)
    • Testes (2)

    VEJA TAMBÉM

    Cursos
    12 de fevereiro de 20166 Mins Read

    1000 livros gratuitos sobre programação!

    Olha que dica bacana! A pagina só com livros sobre programação é mantida no GitHub…

    30 APIs Gratuitas para desenvolvedores

    Facebook X (Twitter) Instagram LinkedIn

    Type above and press Enter to search. Press Esc to cancel.

    Vá para versão mobile