none
Duvidas sobre indices em alteração de collation RRS feed

  • Pergunta

  •   Boa Tarde meus caros. Sei que vou perguntar sobre um assunto super batido e muito discutido nesse forum, mas ainda sim tenho uma dúvida.

     Vou alterar a collation de um banco que está no SQL 2012.

     Sei que o procedimento é(pelo menos é o que li a respeito):

     1) Alterar a collation do banco

    2) Alterar a collation dos campos

    3) Recriar os indices

    Minha dúvida é no terceiro procedimento.

    1) Quando se diz recriar os indices, está falando de tudo: chave primaria, indices, chaves unicas, etc?

    2) Tem uma forma de fazer isso via algum script ou tem que ir em um por um?

    3) A não recriação desses indices geraria qual problema?

    Obrigada!!!


    sexta-feira, 17 de fevereiro de 2017 19:05

Respostas

  • Olá Laraw  na internet existem diversos scripts que fazem o rebuild do index,

    aconselho a não fazer essa operação em horário comercial,

    leia um pouco sobre plano de manutenção ,  vai te ajudar a automatizar seus processos.

    seque documentação 

    Criar um plano de manutenção

    Reorganizar e recriar índices

    eu uso esse.

    use AdventureWorks2012
    GO
    DECLARE @TableName VARCHAR(255)
    DECLARE @sql NVARCHAR(500)
    DECLARE @fillfactor INT
    SET @fillfactor = 80
    DECLARE TableCursor CURSOR FOR
    SELECT OBJECT_SCHEMA_NAME([object_id])+'.'+name AS TableName
    FROM sys.tables
    OPEN TableCursor
    FETCH NEXT FROM TableCursor INTO @TableName
    WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @sql = 'ALTER INDEX ALL ON ' + @TableName +' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')'
    EXEC (@sql)
    FETCH NEXT FROM TableCursor INTO @TableName
    END
    CLOSE TableCursor
    DEALLOCATE TableCursor
    GO


    Wesley Neves

    • Marcado como Resposta LaraW segunda-feira, 20 de fevereiro de 2017 19:00
    sexta-feira, 17 de fevereiro de 2017 22:16
  • Laraw,

    Tente utilizar a stored procedure não documentada: sp_msforeachtable


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta LaraW segunda-feira, 20 de fevereiro de 2017 19:01
    domingo, 19 de fevereiro de 2017 00:58
    Moderador
  • Para alterar a collation de uma coluna que é utilizada por um índice, você terá que excluir esse índice para conseguir fazer isso. Após concluída sua alteração terá que criar o índice novamente.

    Os índices que não tem colunas envolvidas na troca de collation não precisariam ser recriados.

    Vai ter um grande trabalho.... Mas pode fazer isso várias vezes em teste antes de realizar em produção.


    Fabrício França Lima MCITP - SQL Server Database Administrator Trabalho com SQL Server desde 2006 Treinamento DBA ONLINE: http://www.fabriciolima.net/blog/cursos-online/treinamento-tarefas-do-dia-a-dia-de-um-dba-online/

    • Marcado como Resposta LaraW segunda-feira, 20 de fevereiro de 2017 19:01
    domingo, 19 de fevereiro de 2017 22:01
  • Isso aí... Não consegue alterar... Tem que excluir os índices utilizado pelas colunas e depois criar novamente.

    Fabrício França Lima MCITP - SQL Server Database Administrator Trabalho com SQL Server desde 2006 Treinamento DBA ONLINE: http://www.fabriciolima.net/blog/cursos-online/treinamento-tarefas-do-dia-a-dia-de-um-dba-online/

    • Marcado como Resposta LaraW segunda-feira, 20 de fevereiro de 2017 19:44
    segunda-feira, 20 de fevereiro de 2017 19:43

Todas as Respostas

  • Acredito que isso te ajude 

    http://sqlmag.com/database-performance-tuning/seven-step-process-changing-database-collation


    Por favor,  marque-o como respondidas se está respondeu a sua pergunta 
    ou marcá-lo como útil se está ajudou a resolver o seu problema 
    Wesley Neves
    MTA-Database Fundamentals 
    Analista Desenvolvedor.NET



    Wesley Neves

    sexta-feira, 17 de fevereiro de 2017 19:20
  • OK. Vou dar uma lida.

    Obrigada

    sexta-feira, 17 de fevereiro de 2017 19:45
  •   Wesley, li o documento e justamente na parte de recriação dos indices, deixou a desejar.

      Queria saber se posso simplesmente dar um Rebuild All nos indices de cada tabela ou se isso é feito de outra forma ? Se tem uma forma de fazer isso para os indices de todas as tabelas ou tem que ir em tabela por tabela e dar o Rebuild all ?

    Grata!!!

    sexta-feira, 17 de fevereiro de 2017 19:57
  • Olá Laraw  na internet existem diversos scripts que fazem o rebuild do index,

    aconselho a não fazer essa operação em horário comercial,

    leia um pouco sobre plano de manutenção ,  vai te ajudar a automatizar seus processos.

    seque documentação 

    Criar um plano de manutenção

    Reorganizar e recriar índices

    eu uso esse.

    use AdventureWorks2012
    GO
    DECLARE @TableName VARCHAR(255)
    DECLARE @sql NVARCHAR(500)
    DECLARE @fillfactor INT
    SET @fillfactor = 80
    DECLARE TableCursor CURSOR FOR
    SELECT OBJECT_SCHEMA_NAME([object_id])+'.'+name AS TableName
    FROM sys.tables
    OPEN TableCursor
    FETCH NEXT FROM TableCursor INTO @TableName
    WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @sql = 'ALTER INDEX ALL ON ' + @TableName +' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')'
    EXEC (@sql)
    FETCH NEXT FROM TableCursor INTO @TableName
    END
    CLOSE TableCursor
    DEALLOCATE TableCursor
    GO


    Wesley Neves

    • Marcado como Resposta LaraW segunda-feira, 20 de fevereiro de 2017 19:00
    sexta-feira, 17 de fevereiro de 2017 22:16
  • Laraw,

    Tente utilizar a stored procedure não documentada: sp_msforeachtable


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta LaraW segunda-feira, 20 de fevereiro de 2017 19:01
    domingo, 19 de fevereiro de 2017 00:58
    Moderador
  • Para alterar a collation de uma coluna que é utilizada por um índice, você terá que excluir esse índice para conseguir fazer isso. Após concluída sua alteração terá que criar o índice novamente.

    Os índices que não tem colunas envolvidas na troca de collation não precisariam ser recriados.

    Vai ter um grande trabalho.... Mas pode fazer isso várias vezes em teste antes de realizar em produção.


    Fabrício França Lima MCITP - SQL Server Database Administrator Trabalho com SQL Server desde 2006 Treinamento DBA ONLINE: http://www.fabriciolima.net/blog/cursos-online/treinamento-tarefas-do-dia-a-dia-de-um-dba-online/

    • Marcado como Resposta LaraW segunda-feira, 20 de fevereiro de 2017 19:01
    domingo, 19 de fevereiro de 2017 22:01
  • Boa Tarde a todos, 

     Fabricio, com base na sua explicação, então esse roteiro para alterar uma collation de um banco e seus objetos está errado. Quando falo do roteiro me refiro ao processo de alterar o collation do banco, depois altera dos campos das tabelas e depois recria os indices.

      Essa ordem então não funciona, o correto seria alterar a collation do banco, destruir os indices envolvidos, alterar dos campos das tabelas e depois criar os indices novamente. 

     Ou seja, não dá para recriar os indices, tem que destruir e criar de novo e em momentos diferentes.

      Quando fui alterar a collation das colunas tive problema com alguns indices e não achei que era isso, mas como você fez essa observação.


    segunda-feira, 20 de fevereiro de 2017 19:00
  • Isso aí... Não consegue alterar... Tem que excluir os índices utilizado pelas colunas e depois criar novamente.

    Fabrício França Lima MCITP - SQL Server Database Administrator Trabalho com SQL Server desde 2006 Treinamento DBA ONLINE: http://www.fabriciolima.net/blog/cursos-online/treinamento-tarefas-do-dia-a-dia-de-um-dba-online/

    • Marcado como Resposta LaraW segunda-feira, 20 de fevereiro de 2017 19:44
    segunda-feira, 20 de fevereiro de 2017 19:43
  •   OK.  Obrigada a você e a todos os demais!!!
    segunda-feira, 20 de fevereiro de 2017 19:45