none
Performance - manipulação de dados RRS feed

  • Pergunta

  • Estou lendo uma arquivo excel e gravando os dados na tabela.

    Na verdade o que eu quero saber o que é mais performático (mais rápido):

    A cada registro que eu ler da planilha fazer os tratamentos necessários e inserir na tabela ou eu gravar todos os registros na tabela e somente depois ler essa tabela (com os dados gravados) a tratar os registros?

    São milhões de registros que terá na tabela. É milhões mesmo.

    Obrigado

    quinta-feira, 26 de janeiro de 2012 23:29

Todas as Respostas

  • Rafa, bom dia!

    Acredito que seria mais performático e mais facil para você realizar uma inserção em massa (Bulk-Insert) em uma tabela, tratar os dados (visto você terá diversos casos diferentes e com repetições) e se for o caso, carrega-los para a tabela destino.

    Espero ter ajudado, se for o caso, marque como útil e como resposta.


    Rafael Godoi Sabadin
    http://www.linkedin.com/in/rafaelgodoisabadin
    Classifique as respostas. O seu feedback é essencial.
    sexta-feira, 27 de janeiro de 2012 09:49
  • Rafa, concordo com o Rafael Godoi: vc deve importar e depois tratar os dados. Fica mais perfomático, só alteraria a forma de importação dos arquivos, uma vez que via bulk-insert não funciona com arquivos em formato excel. Vc precisa criar mesmo um processo via integration services.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
    sexta-feira, 27 de janeiro de 2012 14:49
  • Rafa,

    O Eduardo está certo, me esqueci deste detalhe. Porem uma solução para utilizar o Bulk-Insert seria salvar o arquivo como .csv.


    Rafael Godoi Sabadin
    http://www.linkedin.com/in/rafaelgodoisabadin
    Classifique as respostas. O seu feedback é essencial.
    sexta-feira, 27 de janeiro de 2012 15:18
  • Boa Tarde,

    Com certeza é muito melhor importar os dados e fazer o tratamento do que a cada registro acessar a mesma planilha de novo. O acesso a planilha é lento e milhares de acesso vão tornar o resultado final muito mais lento.

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    sábado, 28 de janeiro de 2012 20:14
  • Estou usando cursor para ler os dados da tabela.

    O que é melhor nesse caso que tem muitos registros? Usar cursor ou while?

    segunda-feira, 30 de janeiro de 2012 20:12
  • Rafa, cursor não é perfomático. Importe primeiramente o arquivo excel e depois realize os tratamentos necessários.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
    segunda-feira, 30 de janeiro de 2012 20:17
  • Primeiramente importei os dados do excel para a tabela. Para fazer os teste de performance usei o while com temporária e cursor.

    Minha tabela tem um total de 45.249 registros ou linhas.  O while com temporária leu a tabela em 08:56 segundos e o cursor leu a mesma tabela em 07:46 segundos. Ou seja, o cursor foi mais performático. Abaixo posto os códigos que usei para fazer esse teste.

    Se alguém tiver alguma outra sugestão que possa melhorar ainda mais a performance será bem vinda.

    ----------------------------------------------------------
    -- cursor
    ----------------------------------------------------------
       
      DECLARE CURSOR_F5 CURSOR FOR
      
        
       SELECT id_curva  FROM tb_curva
        
       --VARIÁVEIS DO CURSOR 
       DECLARE
        @id_curva INT
       
       OPEN CURSOR_F5
       
       FETCH NEXT FROM CURSOR_F5 INTO @id_curva
       
       WHILE @@FETCH_STATUS = 0
        BEGIN
        

         select @id_curva

         FETCH NEXT FROM CURSOR_F5 INTO @id_curva
        
        END
        
       CLOSE CURSOR_F5

       DEALLOCATE CURSOR_F5
       DEALLOCATE CURSOR_F5

     
    ----------------------------------------------------------
    -- while com temporária
    ----------------------------------------------------------

    declare @id_curva int

    select
    id_curva
    into #temp
    from
     tb_curva


    while exists(select 1 from #temp)
     begin

      set rowcount 1

     

      select
       @id_curva = id_curva
      from
       #temp

      select @id_curva
      
      
      delete from #temp  

      set rowcount 0

     end

    Obrigado pela ajuda.

    segunda-feira, 30 de janeiro de 2012 21:13
  • Rafa, o objetivo de testar os modelos de lopping´s foram apenas para testes de perfomance? Porque se precisa realizar alguma transformação de dados em suas tabelas o ideal não seria utilizar o cursor nem tão pouco o while. O ideal seria utilizar comandos DML. Vc falou em seus testes que para varrer 42k de linhas o SQL demorou 8 minutos. Dependendo do hardware, este é um tempo sofrível em relação a um simples update ou insert

    Se foi mesmo para caráter de teste ok, mas não recomendo de forma alguma utilizar cursores para qualquer tipo de transformação de dados.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
    terça-feira, 31 de janeiro de 2012 13:23
  • Eduardo, para ler o excel, utilizo openrowset. E é super rápido. Não uso um DTS por exemplo por questões de algumas validações e tratamentos que não seria possível DTS.

    Bom o caso é que todas as informações que leio do excel (via openrowset) eu primeiro insero na tabela pra depois começar fazer os tratamentos e validações necessárias. E com um teste mais robusto e real que tive que fazer, tenho que concordar com você que trabalhar com tabela temporária e while com um grande número de informações realmente é bem mais rápido.

    Exemplo disso é: tenho uma procedure que le esse excel (via openrowset) insere na tabela e depois faz todos os tratamentos. Executando a procedure usando cursor, levou 08:27 segundos para inserir os dados do excel na tabela e fazer os tratamentos e validações necessários de 11.360 registros. E executando a procedure usando while e tabela temporária levou 05:08 segundos para inserir os dados do excel na tabela e fazer os tratamentos e validações necessários dos mesmos 11.360 registros.

    Fiz um table scan, usei o wizard de tunning e criei todos os índices necessários.

    Portanto retire o que eu falei. Cursor realmente é útil para uma quantidade "pequena" de registros.

    Agora tá com uma performance como eu queria e previa.

    Valeu!

    quarta-feira, 1 de fevereiro de 2012 23:04