Dúvida LOAD com alterações de Registros

Discussão em 'Banco de Dados / Database' iniciado por FernandaSantos, Agosto 21, 2013.

  1. FernandaSantos

    FernandaSantos Membro Participativo

    Bom dia Pessoal,

    Aqui na empresa temos uma base de dados enorme, e devido ao projeto atual que está contemplando novas tabelas, novos campos etc, precisaremos alterar vários registros (Ex.: resequenciar documentos) e popular novos campos.

    A primeira tentativa foi fazer o dump/load , idxbuilder (devido novos índices e indíces antigos ruins) e em seguida uma rotina (.p) para atualizar estes campos.
    Demorou demais! ... cerca de 11 horas somente para a rotina de atualização, e infelizmente no dia da virada, teremos penas uma "janela" de 9 horas para dump/load, idxbuilder e atualização dos dados.

    Ouvi dizer que uma maneira mais rápida seria fazer a atualização destes registros no DUMP/LOAD, conforme fazem os programas da Datasul para a migração do EMS204 para EMS206.

    Estes programas fazem algo tipo o código abaixo:

    Código:
    
    for each saldo-conta-modul   no-lock:
    
        assign
            c-ep-codigo = saldo-conta-modul.ep-codigo
            c-ano-fiscal = saldo-conta-modul.ano-fiscal
            c-cod-modul-dtsul = saldo-conta-modul.cod-modul-dtsul
            c-conta-contabil = saldo-conta-modul.conta-contabil
            c-mo-codigo = saldo-conta-modul.mo-codigo
            
            c-saldo[1] = saldo-conta-modul.saldo[1]
            c-saldo[2] = saldo-conta-modul.saldo[2]
            c-saldo[3] = saldo-conta-modul.saldo[3]
            c-saldo[4] = saldo-conta-modul.saldo[4]
            c-saldo[5] = saldo-conta-modul.saldo[5]
            c-saldo[6] = saldo-conta-modul.saldo[6]
            c-saldo[7] = saldo-conta-modul.saldo[7]
            c-saldo[8] = saldo-conta-modul.saldo[8]
            c-saldo[9] = saldo-conta-modul.saldo[9]
            c-saldo[10] = saldo-conta-modul.saldo[10]
            c-saldo[11] = saldo-conta-modul.saldo[11]
            c-saldo[12] = saldo-conta-modul.saldo[12]
            c-saldo[13] = saldo-conta-modul.saldo[13]
            c-debito[1] = saldo-conta-modul.debito[1]
            c-debito[2] = saldo-conta-modul.debito[2]
            c-debito[3] = saldo-conta-modul.debito[3]
            c-debito[4] = saldo-conta-modul.debito[4]
            c-debito[5] = saldo-conta-modul.debito[5]
            c-debito[6] = saldo-conta-modul.debito[6]
            c-debito[7] = saldo-conta-modul.debito[7]
            c-debito[8] = saldo-conta-modul.debito[8]
            c-debito[9] = saldo-conta-modul.debito[9]
            c-debito[10] = saldo-conta-modul.debito[10]
            c-debito[11] = saldo-conta-modul.debito[11]
            c-debito[12] = saldo-conta-modul.debito[12]
            c-debito[13] = saldo-conta-modul.debito[13]
            c-credito[1] = saldo-conta-modul.credito[1]
            c-credito[2] = saldo-conta-modul.credito[2]
            c-credito[3] = saldo-conta-modul.credito[3]
            c-credito[4] = saldo-conta-modul.credito[4]
            c-credito[5] = saldo-conta-modul.credito[5]
            c-credito[6] = saldo-conta-modul.credito[6]
            c-credito[7] = saldo-conta-modul.credito[7]
            c-credito[8] = saldo-conta-modul.credito[8]
            c-credito[9] = saldo-conta-modul.credito[9]
            c-credito[10] = saldo-conta-modul.credito[10]
            c-credito[11] = saldo-conta-modul.credito[11]
            c-credito[12] = saldo-conta-modul.credito[12]
            c-credito[13] = saldo-conta-modul.credito[13]
            c-ct-codigo = saldo-conta-modul.ct-codigo
            c-sc-codigo = saldo-conta-modul.sc-codigo
            c-cod-livre-1 = saldo-conta-modul.cod-livre-1
            c-cod-livre-2 = saldo-conta-modul.cod-livre-2
            c-log-livre-1 = saldo-conta-modul.log-livre-1
            c-log-livre-2 = saldo-conta-modul.log-livre-2 .
        assign
            c-num-livre-1 = saldo-conta-modul.num-livre-1
            c-num-livre-2 = saldo-conta-modul.num-livre-2
            c-val-livre-1 = saldo-conta-modul.val-livre-1
            c-val-livre-2 = saldo-conta-modul.val-livre-2
            c-dat-livre-1 = If saldo-conta-modul.dat-livre-1 < 01/01/1753 Then &IF "{&ems_dbtype}":U = "MSS":U &THEN 01/01/1800 &ELSE saldo-conta-modul.dat-livre-1 &ENDIF Else saldo-conta-modul.dat-livre-1
            c-dat-livre-2 = If saldo-conta-modul.dat-livre-2 < 01/01/1753 Then &IF "{&ems_dbtype}":U = "MSS":U &THEN 01/01/1800 &ELSE saldo-conta-modul.dat-livre-2 &ENDIF Else saldo-conta-modul.dat-livre-2 .
    
        export
            c-ep-codigo
            c-ano-fiscal
            c-cod-modul-dtsul
            c-conta-contabil
            c-mo-codigo
            c-saldo[1]
            c-saldo[2]
            c-saldo[3]
            c-saldo[4]
            c-saldo[5]
            c-saldo[6]
            c-saldo[7]
            c-saldo[8]
            c-saldo[9]
            c-saldo[10]
            c-saldo[11]
            c-saldo[12]
            c-saldo[13]
            c-debito[1]
            c-debito[2]
            c-debito[3]
            c-debito[4]
            c-debito[5]
            c-debito[6]
            c-debito[7]
            c-debito[8]
            c-debito[9]
            c-debito[10]
            c-debito[11]
            c-debito[12]
            c-debito[13]
            c-credito[1]
            c-credito[2]
            c-credito[3]
            c-credito[4]
            c-credito[5]
            c-credito[6]
            c-credito[7]
            c-credito[8]
            c-credito[9]
            c-credito[10]
            c-credito[11]
            c-credito[12]
            c-credito[13]
            c-ct-codigo
            c-sc-codigo
            c-cod-livre-1
            c-cod-livre-2
            c-log-livre-1
            c-log-livre-2
            c-num-livre-1
            c-num-livre-2
            c-val-livre-1
            c-val-livre-2
            c-dat-livre-1
            c-dat-livre-2
        .
    
        assign cont-reg   = cont-reg + 1
               cont-reg-d = cont-reg-d + 1.
    
    
        IF SEEK(OUTPUT) > 1500000000 THEN DO:
    
    
    
        put unformatt "." skip.
        assign trailer = seek(output).
        put unformatt "PSC" skip.
        put unformatt "filename=saldo-conta-modul" skip.
        put unformatt "records=" string(cont-reg-d,'9999999999999') skip.
        put unformatt "ldbname=mgadm" skip.
        put unformatt "timestamp=1996/05/12-16:11:46" skip.
        put unformatt c-numformat skip.
        put unformatt c-dateformat skip.
        put unformatt "map=NO-MAP" skip.
        put unformatt "cpstream=" + session:cpstream skip.
        put unformatt "." skip.
        put unformatt string(trailer,"9999999999") skip.
        output close.
        
        
        
        output to value(c-diretorio-exportacao + "ad383.d" + STRING(cont-arquivos-d,"99")).
        
        
        ASSIGN cont-arquivos-d = cont-arquivos-d + 1
               cont-reg-d = 0.
    
    
        END.
    end.
    
    put unformatt "." skip.
    assign trailer = seek(output).
    put unformatt "PSC" skip.
    put unformatt "filename=saldo-conta-modul" skip.
    put unformatt "records=" string(cont-reg,'9999999999999') skip.
    put unformatt "ldbname=mgadm" skip.
    put unformatt "timestamp=1996/05/12-16:11:46" skip.
    put unformatt c-numformat skip.
    put unformatt c-dateformat skip.
    put unformatt "map=NO-MAP" skip.
    put unformatt "cpstream=" + session:cpstream skip.
    put unformatt "." skip.
    put unformatt string(trailer,"9999999999") skip.
    output close.
    
    Alguém saberia me explicar como funcionaria para que eu faça o mesmo com as minhas tabelas específicas?
    Após gerar estes arquivos ".d" basta importar pelo LOAD no DataAdministrator ?

    Muito obrigado!
  2. atila.cm

    atila.cm Membro Participativo

    Bom, meu caro,
    como ninguém te respondeu, aí vai...

    Sempre que necessito fazer um UPGRADE em uma base de dados onde é necessário criar ou excluir tabelas, campos ou índices utilizei o DUMP INCREMENTAL para gerar o .DF com as modificações na base de dados.
    1o. abra o data admnistration
    2o. conecte o banco antigo e o banco com as modificações
    3o. em ADMIN / DUMP... / CREATE INCREMENTAL .DF FILE gere o DELTA.DF
    4o. com o DELTA.DF criado, faça o LOAD do DELTA.DF na base que pretende fazer o UPGRADE.
    Quanto aos dados as inclusões, modificações e exclusões de dados nas tabelas sempre utilizo um .P.
    Como tenho certeza de que as alterações nos dados estão corretas utilizo o DISABLE TRIGGERS para cada tabela tratada.
    Não esqueça de utilizar o NO TRANSACTION.
    Outra coisa, rodo o .P diretamente no servidor de dados, assim o processo é mais rápido.

    Espero ter ajudado.

    Boa Sorte.

    Atila.cm
    atila.cm@hotmail.com
    Consultoria e Progress
  3. FernandaSantos

    FernandaSantos Membro Participativo

    Oi Atila, valeu pelo retorno hein!

    Quanto ao Dump/Load estou fazendo com o incremental, conforme sugeriu..

    O maior problema está na execução do programa que atualiza os regsitros que está demorando 11 horas.

    Das dicas que me deu, ainda não tentei colocar o NO TRANSACTION... vou fazer isso e ver os resultados!
    Posto aqui se tiver alguma melhora...

    Caso alguem tenha algum exemplo para para o meu primeiro POST também ajuda muito!!

    Obrigado!!
  4. klebaum

    klebaum Membro Participativo

    Tenho certeza que é passado e assunto já resolvido, mas fiquei curioso:
    - Qual o motivo de ter sido necessário fazer um dump/load? Você não poderia alterar os registros que já estavam na base?

    Um dica, quando precisar novamente, é fazer o load com os indíces desativados, o que agiliza muito a importação.
  5. SAC

    SAC Membro Participativo

    Melhor é o dump binário, que já faz com os índices desativados. Mas o que a Fernanda té enfrentando problemas é na necessiade do fonte, que neste caso eu faria em etapas. 1) Faz tudo que precisa na tabela (incremento de campos), faz o dump e load "normal", na sequencia roda o programa de ajuste de conteúdo dos campos (pode ser até com a base já no ar) e depois em outra oportunidade elimina o que tem que ser eliminado das tabelas. Com isso diminui o tempo de parada, que pelo que entendi era o problema.
  6. FernandaSantos

    FernandaSantos Membro Participativo

    Olá, Klebaum/SAC,

    Na ocasião acabei fazendo mais ou menos conforme o SAC sugeriu.
    Ocorre que o grande problema na ocasião eram os índices. Devido uma alteração no processo, muitas tabelas antigas, com grande volume de movimentos, tiveram as chaves alteradas, e foi preciso atualizar os registros passados.

    No fim deu tudo certo, obrigada pelas dicas!

Compartilhe esta Página