none
Update em milhoes de registros RRS feed

  • Pergunta

  • Galera,

    preciso de dicas para poder atualizar uma tabela que contém uma média de 56milhoes de registro, e mais ou menos 80% dessa tabela vai ser atualizada quando um procedimento for executado.

    update d
    set d.Desconto = p.Desconto
    from #DescontoVigente410 d
    inner join #Desconto5porcento p on p.IdProduto = d.IdProduto and p.IdLoja = d.IdLoja

    update d
    set d.Desconto = p.Desconto
    from #DescontoVigente410 d
    inner join #Desconto10porcento p on p.IdProduto = d.IdProduto and p.IdLoja = d.IdLoja

    problema que tou estourando o espaço do tempdb. Alguem pode me d uma ajuda?


    sábado, 29 de julho de 2017 13:07

Respostas

Todas as Respostas

  • Você esta fazendo uma atualização em uma tabela temporária é isso mesmo?Qual seria a finalidade?

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    sábado, 29 de julho de 2017 15:55
  • Deleted
    sábado, 29 de julho de 2017 16:57
  • RenatoJorgeCastro  

    algo errado não está certo  , vc falou que tem uma media de 56 milhoes de registros e que 80% desses registros vao ser atualizados

    o que da 45 millhoes de registros

    e necessário realmente atualizar isso ?? por rotina executada

    vc está jogando esses dados da tabela temporária pra que motivo ??

    se vc vai atualizar algo isso deve ser efetivado em alguma tabela fisicamente no banco ou seja ,pelo que eu entendi

    1) vc faz insert de 45 milhôes de registros na #DescontoVigente410 

    2) vc faz um Update nesses 45 milhôes de registros 

    3) esses dados vao para uma tabela fisica 

    por que nao faz o update direto na tabela fisica

    seque um esbolso

    begin tran transacaoUpdate
    
    create nonclustered index IdxsuatabelaFisica ON tabelaFisica(IdProduto,IdLoja) include(Desconto)
    
    update d
    set d.Desconto = p.Desconto
    from DescontoVigente410 d
    inner join tabelaFisicaDesconto5porcento p on p.IdProduto = d.IdProduto and p.IdLoja = d.IdLoja
    
    update d
    set d.Desconto = p.Desconto
    from DescontoVigente410 d
    inner join tabelaFisicaDesconto10porcento p on p.IdProduto = d.IdProduto and p.IdLoja = d.IdLoja
    
    comit tran transacaoUpdate

    Outra alternativa que vejo e que se sua versao so sql server for apartir do 2014, vc tem a opçao de trabalhar em memoria que seria uma otima opção

    in-memory-oltp

    Olha esse exemplo aqui 

    https://docs.microsoft.com/pt-br/sql/relational-databases/in-memory-oltp/faster-temp-table-and-table-variable-by-using-memory-optimization



    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"




    Wesley Neves



    Wesley Neves

    sábado, 29 de julho de 2017 17:45
  • Renato,

    tente separar essa grande transação de 56M em transações menores, por exemplo colocando filtros por IdLoja ou IdProduto.

    Não sei o volume por loja, mas o código abaixo pode ser um exemplo para você usar de acordo com a granularidade dos seus dados.

    select distinct d.IdLoja into #tab_loja from #DescontoVigente410 d
    inner join #Desconto10porcento p on p.IdProduto = d.IdProduto and p.IdLoja = d.IdLoja
    
    declare @loja int
    
    while exists (select 1 from #tab_loja)
    
    begin
    
    	select @loja = min(idLoja) from #tab_loja
    
    update d
    set d.Desconto = p.Desconto
    from #DescontoVigente410 d
    inner join #Desconto10porcento p on p.IdProduto = d.IdProduto and p.IdLoja = d.IdLoja
    where d.IdLoja = @loja
    
    delete from #tab_loja where idLoja = @loja
    
    
    end



    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    domingo, 30 de julho de 2017 03:43
  • Renato, 

    Como a galera já disse ai, faça o update em partes (X registros por vez).

    Seu transaction log pode crescer bem se fizer tudo de uma vez. E vai demorar bastante.


    Fabricio Lima - MVP SQL Server Data Platform | 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/

    domingo, 30 de julho de 2017 23:53
  • Galeraq, obrigado pela atenção. assim q chegar no trbalho, vou testar as possibilidades e responder as perguntas. Mas muito obrigado!
    segunda-feira, 31 de julho de 2017 10:33
  • Bom dia, RenatoJorgeCastro.

    Obrigado por usar o fórum MSDN.

    Aguardamos teu retorno então!

    Atenciosamente,


    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 31 de julho de 2017 12:41
    Moderador
  • Renato,

    Podemos também pensar em criar uma Stored Procedure para fazer este procedimento e durante a execução desta procedure alterar o Modelo de Recuperação do seu Banco de Dados para Bulk Logged, sendo este mais indicado para trabalhar com manipulação de dados em grande escala, o que vai orientar o SQL Server a somente gerar o log para outros processos e não registrar o que esta sendo manipulado durante o seu update.

    Pode ser uma possibilidade de diminuir o impacto no processamento e principalmente no crescimento e atualização do transact-log.


    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]

    terça-feira, 1 de agosto de 2017 16:31