none
Importação de dados em massa RRS feed

  • Pergunta

  • Bom dia!

    Estou tentando realizar uma Importação  de dados de uma tabela em um servidor  para outro servidor, são bases diferentes e estou tentando tentando atraves de  linked server e utilizando merge. Mas é uma tabela  com cerca de 193.114.961 (e crescendo) de registros e ela não possui um campo único de forma que eu possa utilizar na ligacao das duas tabelas entre as duas bases no merge, eu até posso utilizar um conjunto de campos para garantir a unicidade do registro, mas em uma tentativa de trazer um TOP 10, cheguei a 3 minutos de execução e não obtive resultados.

    Estou em busca de novas ideias ou mesmo dicas que podem melhorar o meu processo atual. Meu objetivo é apenas manter um servico que copie  a diferenca de dados entre as duas tabelas diariamente, sem a nescessidade de atualizar ou deletar o que ja foi copiado.

    Desde ja, agradeço.


    • Editado Fabianomaso sábado, 25 de abril de 2015 13:11
    sábado, 25 de abril de 2015 13:08

Respostas

  • Deleted
    sábado, 25 de abril de 2015 20:19
  • Fabiano, bom dia.

    Você já pensou em utilizar o Integration Services pra isso?

    Eu alterei alguns processos antigos aqui que usavam linked server para um pacote do Integration que faz o tratamento dos dados e a exportação.

    Na média obtive um ganho de 70% no tempo.

    Você pode fazer um teste utilizando o Lookup do SSIS com essas 13 colunas. Acredito que vá ganhar em tempo de execução!


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    segunda-feira, 27 de abril de 2015 14:11

Todas as Respostas

  • Fabiano,

    Não existe nenhuma combinação de campos que vc possa utilizar como uma espécie de chave, comparando origem e destino?

    Se vc conseguir determinar algo que se encaixe nisso, fica mais tranquilo o processo de importar apenas diferenças.

    sábado, 25 de abril de 2015 13:28
  • Eu tenho uma combinacao de 13 campos para garantir isso, mas acabei de fazer outro teste aqui de top 10 e demorou 15 segundos. e assim, se na melhor das hipoteses ele levar 1 segundo por registro, ainda sim vai demorar um bom tempo para poder preencher a massa de arquivos inicial.
    sábado, 25 de abril de 2015 13:40
  • Você não tem permissão para alteração dessa base de dados aonde esta consultando para criação de um novo campo?

    Esse Merge que esta realizando com Linked Server, está utilizando o insert SSIS?


    Uma imagem vale mais do que mil palavras, mas ocupa 3 mil vezes mais espaço em disco

    sábado, 25 de abril de 2015 14:17
  • O processo inicial realmente tende a ser demorado, como vc mesmo disse.

    Uma coisa que fazemos no nosso trabalho com grandes massas de dados é controlar novas inclusões com um flag. Partindo desta premissa, filtramos apenas os novos registros, de forma a tornar as cargas posteriores mais rápidas.

    Acredito que esta seja uma possiblidade também, a fim de tornar o processo mais veloz depois desta carga inicial.

    sábado, 25 de abril de 2015 14:19
  • Infelizmente a base de origem, nao tenho acesso para alterações, apenas consulta. Em resumo estou executando o comando direto por enquanto:

    MERGE INTO banco.schema.table T
           USING (
                SELECT 
     a
    b,
    c,
    
    
                 FROM linkserver.banco.schema.tabela WITH (nolock) 
                 ) S ON 
       
    S.a = T.a1
    S.b = T.b1 
    
    WHEN NOT MATCHED THEN
        INSERT 
        (  
      a1
    , b1
    , c1
    )
        VALUES ( 
     S.a
    , S.b
    , S.c
    );

    (simplifiquei o codigo)

     Dpois que ele ficar ele tiver OK é que vou alimentar uma procedure com ele e consequentemente um job.



    • Editado Fabianomaso sábado, 25 de abril de 2015 14:52
    sábado, 25 de abril de 2015 14:51
  • Entendi, fica um pouco complicado, você mencionou que essa tabela não tem um campo unico correto?

    Ela possui algum campo com data e hora? ou alguma tabela que tem ligação com ela possui algum campo com data e hora?

    Pois se tiver fica mais facil para realização do merge.


    Uma imagem vale mais do que mil palavras, mas ocupa 3 mil vezes mais espaço em disco

    sábado, 25 de abril de 2015 15:10
  • Deleted
    sábado, 25 de abril de 2015 20:09
  • Deleted
    sábado, 25 de abril de 2015 20:19
  • Bom dia, consegui separar 13 colunas para formarem de forma unica a linha. Quanto a indices, o top 10 era apenas um test drive  de como ele iria se comportar, o processo em si inicial vai ser uma massa de informacoes que irei copiar e como mencionei acima, tenho apenas permissao de leitura nessa base, nao consigo ver detalhes sobre indices nem nada.

    (desculpem a ausencia de pontuacoes, esto usando um teclado americano e nao me acostumei com ele)

    segunda-feira, 27 de abril de 2015 11:25
  • Bom dia, 

    Infelizmente nao tenho acesso a tabela de origem, apenas posso consulta la. O processo atual que faco do merge atraves de linked server ja funciona perfeitamente em outros projetos meus na mesma base, essa em questao o que me preocupa um pouco e o grande volume de informacoes que terei que transferir inicialmente e a quantidade de chaves (13) que estou utilizando, pois como so tenho acesso a leitura nao tenho como otimizar a origem para melhorar o processo.


    (desculpem a ausencia de pontuacoes, estou usando um teclado americano e nao me acostumei com ele)

    segunda-feira, 27 de abril de 2015 11:29
  • Deleted
    segunda-feira, 27 de abril de 2015 14:11
  • Fabiano, bom dia.

    Você já pensou em utilizar o Integration Services pra isso?

    Eu alterei alguns processos antigos aqui que usavam linked server para um pacote do Integration que faz o tratamento dos dados e a exportação.

    Na média obtive um ganho de 70% no tempo.

    Você pode fazer um teste utilizando o Lookup do SSIS com essas 13 colunas. Acredito que vá ganhar em tempo de execução!


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    segunda-feira, 27 de abril de 2015 14:11
  • Boa tarde, 

    Todas as linhas seram lidas e copiadas e na clausula where estou verificando a melhor combinacao de importacao por periodo, ja que sao dados de 5 anos ao longo de 12 meses.

    Origem:

    Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64)   xxxxxxx   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 

    Destino:

    Microsoft SQL Server 2008 (SP3) - 10.0.5844.0 (X64)   xxxxxxxx   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 

    segunda-feira, 27 de abril de 2015 17:30
  • Assim, nao  pois ouvi falar muito pouco nele e ate o presente momento nao tenho quase nenhum conhecimento de como ele funciona.
    segunda-feira, 27 de abril de 2015 17:31
  • Deleted
    segunda-feira, 27 de abril de 2015 18:51
  • Segue:

    img ampliada: IMAGEM

    Plano do Merge


    • Editado Fabianomaso segunda-feira, 27 de abril de 2015 19:26
    segunda-feira, 27 de abril de 2015 19:26
  • Deleted
    segunda-feira, 27 de abril de 2015 19:52
  • Pergunta de iniciante, mas sem indice nao é mais facil para inserir? Infelizmente nao posso disponibilizar o plano em xml, desculpe.

    segunda-feira, 27 de abril de 2015 20:05
  • Deleted
    terça-feira, 28 de abril de 2015 00:22
  • Deleted
    terça-feira, 28 de abril de 2015 10:00
  • Criei o indice e realmente o custo para a tabela de destino reduziu drasticamente, analizando o plano do merge, vou comparar com a essa sua estrutura do codigo 2 e ver no que da.
    terça-feira, 28 de abril de 2015 13:20
  • Deleted
    terça-feira, 28 de abril de 2015 21:26
  • Bom dia,

    Sim incialmente nao criei indices, pois pensei que seria mais facil para inserir, ja que o processo de consulta so ocorreria depois, entao os indices adequados eu iria criar depois tambem. Como disse criei um indice envolvendo as 13 colunas e atendendo a esse requisito de maior para menor seletividade como vc mencionou, infelizmente eu so posso testar isso de madrugada quando nao ha usuarios no banco e eu acabei esquecendo de ativar o job ontem entao ainda nao pude dar uma resposta sobre os resultados obtidos. 

    - Estou tentando fazer micro testes aqui para ver o que terei de resultados.

    Enquanto isso fiquei com um duvida, se puder tira la agradeco. (novato na area on!)

    Qual  seria a diferenca entre usar o comando MERGE normal com aquele MERGE utilizando o OPENQUERY que vc postou mas editou naquele dia?


    quarta-feira, 29 de abril de 2015 13:11
  • Deleted
    quinta-feira, 30 de abril de 2015 10:14