none
Dúvida sobre index RRS feed

  • Pergunta

  • Olá Pessoal? 
    Por favor, alguém poderia me ajudar eu estou com uma dúvida sobre fragmentação de index, aqui na empresa onde eu trabalho, nunca foi feito uma desfragmentação dos Index.
    Eu rodei esse script onde me fala todos os index e a porcentagem de fragmentação.

    SELECT
               NameIndex.index_id,
               NameIndex.name,
               index_type_desc,
               avg_fragmentation_in_percent
    FROM 
               sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, NULL) AS frag
    INNER JOIN
               sys.indexes AS NameIndex
    ON
               frag.object_id = NameIndex.object_id
    ORDER BY
               avg_fragmentation_in_percent DESC
    GO

    Tenho vários index que estão com mais de 99% fragmentado, tanto index Nonclustered e Clustered
     
    Gostaria de saber se eu posso executar esse seguinte código para organizar os index?

    ALTER INDEX ALL
    ON MinhaTabela
    REBUILD

    Se eu executar esse código pode afetar em alguma coisa o meu banco de dados? Nunca executei rebuild de index em ambiente de produção, gostaria de saber se pode acontecer alguma fora do esperado. 

    Alguém tem alguma dica sobre isso que possa me passar?

    Obrigado


    Wellinghton Pimentel Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 2 de abril de 2013 12:28

Respostas

  • Willington,

    Não irá afetar em nada seu banco de dados, só tome cuidado que voce causara lock em suas tabelas portanto não recomendo a execução do mesmo em horario de produção por exemplo.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    terça-feira, 2 de abril de 2013 12:30
    Moderador

Todas as Respostas

  • Willington,

    Não irá afetar em nada seu banco de dados, só tome cuidado que voce causara lock em suas tabelas portanto não recomendo a execução do mesmo em horario de produção por exemplo.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    terça-feira, 2 de abril de 2013 12:30
    Moderador
  • Ah legal, a minha ideia era realmente realizar o rebuild fora do horário de produção.

    Fabrizzio muito obrigado pela ajuda.


    Wellinghton Pimentel Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 2 de abril de 2013 12:34
  • Wellington, bom dia!

    Para facilitar sua vida, use esse script para encontrar fragmentação em suas bases de dados.

    USE NomeBancoDados
    go
    
    IF OBJECT_ID('dbo.fn_FragmentacaoIndice') IS NOT NULL
    	DROP FUNCTION dbo.fn_FragmentacaoIndice
    GO
    
    CREATE FUNCTION dbo.fn_FragmentacaoIndice
    (@Frag INT) RETURNS TABLE 
    AS 
    RETURN
    SELECT  TOP 10000
    		'[' + DB_NAME() + '].[' + OBJECT_SCHEMA_NAME(ddips.[object_id], 
    		DB_ID()) + '].[' + OBJECT_NAME(ddips.[object_id], DB_ID()) + ']' AS [Object] ,
            CASE WHEN i.[name] IS NULL THEN 'Tabela Heap/Sem Índice' ELSE i.[name] END AS [Index] ,
            ddips.[index_type_desc] AS [Index Type],
            ddips.[partition_number] AS [Partition Number],
            ddips.[alloc_unit_type_desc] AS [Allocation Unit Type],
            ddips.[index_depth] AS [Index Depth],
            ddips.[index_level] AS [Index Level],
            CAST(ddips.[avg_fragmentation_in_percent] AS SMALLINT)
                AS [Average Fragmentation (%)] ,
            CAST(ddips.[avg_fragment_size_in_pages] AS SMALLINT)
                AS [Average Fragment Size (pages)] ,
            ddips.[fragment_count] AS [Fragments],
            ddips.[page_count] AS [Pages]
    FROM    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') ddips
            INNER JOIN sys.[indexes] i ON ddips.[object_id] = i.[object_id]
    			AND ddips.[index_id] = i.[index_id]
    WHERE ddips.[avg_fragmentation_in_percent] >= @Frag
    ORDER BY ddips.[avg_fragmentation_in_percent], OBJECT_NAME(ddips.[object_id], DB_ID()) , i.[name]
      
    --	SELECT * FROM dbo.fn_FragmentacaoIndice(15)
    
    
    
    


    /* Se útil por favor classifique a resposta */

    terça-feira, 2 de abril de 2013 12:47
  • Luan muito obrigado pelo script muito legal mesmo

    Wellinghton Pimentel Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 2 de abril de 2013 13:05
  • Pessoal como eu posso fazer para automatizar a minha rotina para reorganizar os indexes?

    Estou usando o seguinte script para reorganizar:

    ALTER INDEX ALL
    ON NomeDaTabela
    REBUILD

    é possível eu colocar um "range" de tabela? Exemplo da tabela AAA1 até AAA20

    Obrigado

    Wellinghton Pimentel Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.


    quarta-feira, 3 de abril de 2013 13:05