Pular para o conteúdo
  • Este tópico contém 11 respostas, 3 vozes e foi atualizado pela última vez 11 anos, 1 mês atrás por Avatar de Andrei RubinoAndrei Rubino.
Visualizando 12 posts - 1 até 12 (de 12 do total)
  • Autor
    Posts
  • #105877
    Avatar de Andrei RubinoAndrei Rubino
    Participante

      Amigos,
      Gostaria de receber algumas dicas, contando a experiencia de vocês…

      Estou realizando uma conversão de dados de varias tabelas para uma.
      Simplesmente um Cursor com Bulk Collect com um select e alguns joins,
      e no loop um insert em uma tabela.
      A tabela principal que eu pego os dados é a tabela DIVIDA que possui 27 milhões de registros, e a que quero inserir é na PES_DIVIDA.
      Desses 27 milhões cerca de 24 vão ser inseridos devido a regras de negocio.

      O que eu gostaria de fazer é criar uma flag na Tabela DIVIDA para comparar se o registro já foi inserido ou não na PES_DIVIDA.
      E no loop do cursor ir dando update para SIM para o registro inserido pelo Rowid.

      Seria essa a melhor forma em questão de performance ?

      Obrigado !!!

      #105878
      Avatar de rmanrman
      Participante

        @Andrei Rubino

        Posta a descrição das 2 tabelas. Isso é uma manutenção pontual ou você irá automatizar isso para rodar regularmente?

        #105879
        Avatar de Andrei RubinoAndrei Rubino
        Participante

          @rman

          É uma conversão de sistemas, irei realizar de 2 a 3 vezes….

          Segue a descrição das tabelas.
          Não sei se o UPDATE é uma boa ideia pois a tabela possui uma quantidade considerável de registros
          (27 milhões).
          Mas ao mesmo tempo não tive outra ideia.

          O que acha rman ?


          /* DIVIDA */
          Nome Nulo Tipo


          TIPODIVIDA VARCHAR2(1)
          INSCRICAO NUMBER
          ANOREFER NUMBER
          MESREFER NUMBER
          SEQLEITURA NUMBER
          SEQPARCELA NUMBER
          VALORAGUA NUMBER(12,2)
          VALORESGOTO NUMBER(12,2)
          VALORDIVERSOS NUMBER(12,2)
          SITUACAOLANCTO VARCHAR2(1)
          SITUACAOPAGTO VARCHAR2(1)
          CONSUMO NUMBER
          CODTRIBUTACAO NUMBER
          QTDEECONRES NUMBER
          QTDEECONCOM NUMBER
          QTDEECONIND NUMBER
          QTDEECONPUB NUMBER
          TIPOLIGACAO VARCHAR2(1)
          SITHIDROMETRO VARCHAR2(1)
          CREDITOCONSUMO NUMBER
          USUARIO VARCHAR2(30)
          DATA DATE
          TIPOMOVIMENTO VARCHAR2(1)
          HORARIO VARCHAR2(8)
          DTVENCTO DATE
          VALORPAGO NUMBER(12,2)
          DATAPAGO DATE
          CGC_CPF VARCHAR2(15)
          NR_DIFER NUMBER
          NR_MATRICULA_UNIDADE NUMBER
          DT_MES_ANO_REF DATE

          ===================================================================================================================================

          /PES DIVIDA/
          Nome Nulo Tipo


          NR_MATRICULA NOT NULL NUMBER(10)
          DT_MES_ANO NOT NULL DATE
          NR_DIFER NOT NULL NUMBER(2)
          CD_MUNICIPIO NOT NULL NUMBER(3)
          NR_SETOR NOT NULL NUMBER(3)
          NR_QUADRA NOT NULL NUMBER(3)
          NR_LOTE NOT NULL NUMBER(4)
          NR_UNIDADE NOT NULL NUMBER(2)
          ID_SITUACAO NOT NULL NUMBER(1)
          TP_EMISSAO NOT NULL VARCHAR2(1)
          DT_EMISSAO NOT NULL DATE
          CD_MOTIVO_EMISSAO NOT NULL NUMBER(3)
          ID_SITUAC_PAGTO NOT NULL VARCHAR2(1)
          DT_VENCTO NOT NULL DATE
          QT_VOLUME_FATURADO NOT NULL NUMBER(6)
          VL_FATURA NOT NULL NUMBER(15,2)
          NR_SEQ NOT NULL NUMBER(18)
          ID_COBRANCA_MULTA NOT NULL VARCHAR2(1)
          ID_TIPO_FATURA NOT NULL VARCHAR2(1)
          NR_SEQ_GRUPO_FATMTO NOT NULL NUMBER(6)
          DT_LIMITE_PAGTO NOT NULL DATE
          VL_PAGO NUMBER(15,2)
          DT_PAGTO DATE
          NR_GRUPO_FATMTO NUMBER(2)
          DT_CANCEL DATE
          CD_MOTIVO_CANCEL NUMBER(3)
          NR_HIDROMETRO VARCHAR2(10)
          TP_CATEG_PRINCIPAL VARCHAR2(1)
          ID_ENTREGA_FATURA NUMBER(1)
          TP_COBRANCA VARCHAR2(1)
          ID_SITUAC_INSTAL NUMBER(1)
          TP_ATENDIMENTO NUMBER(1)
          CD_MUNICIPIO_ENTREGA NUMBER(3)
          NR_SETOR_ENTREGA NUMBER(3)
          NR_QUADRA_ENTREGA NUMBER(3)
          NR_LOTE_ENTREGA NUMBER(4)
          NR_UNIDADE_ENTREGA NUMBER(2)
          CD_ORGAO_CENTRAL NUMBER(5)
          CD_ENTREGA NUMBER(3)
          TP_CALCULO CHAR(1)
          VL_BASE_IMPOSTO NUMBER(15,2)
          NM_CONTA_USUARIO_ALT_FAT VARCHAR2(15)
          DT_HORA_ALT_FAT DATE
          NR_TOMADAS NUMBER(3)
          QT_CONSUMO_MEDIO NUMBER(6)
          DT_SITUACAO_INSTAL DATE
          ID_SITUAC_INSTAL_ANT NUMBER(1)
          DT_SITUAC_INSTAL_ANT DATE
          ID_UNIDADE_CENTRALA VARCHAR2(1)
          DT_VENCTO_ALTERN NUMBER(2)
          ID_CALCULO_ECONOMIA VARCHAR2(1)
          ID_RECALC_UNIDADE CHAR(1)
          TP_CONSUMO NUMBER(1)
          QT_VOLUME_REAL NUMBER(6)
          CD_ETE NUMBER(3)
          TP_CANCELAMENTO NUMBER
          DS_ATIVIDADE_R VARCHAR2(50)
          DS_ATIVIDADE_C VARCHAR2(50)
          DS_ATIVIDADE_I VARCHAR2(50)
          DS_ATIVIDADE_P VARCHAR2(50)
          ID_FATURA_REMIDA CHAR(1)
          NR_LEI_REMISSAO NUMBER(5)
          NR_ANO_LEI NUMBER(4)

          ===================================================================================================================================

          #105881
          Avatar de rmanrman
          Participante

            @Andrei Rubino

            Verifique a possibilidade de inserir os dados via sql loader.

            #105887
            Avatar de Andrei RubinoAndrei Rubino
            Participante

              @rman
              Estava estudando a possibilidade de utilizar o loader é possível sim,
              no entanto não consigo pelo SQL Developer exportar os dados para um arquivo do tipo loader,
              por causa da quantidade de registros.

              Acredita que o mais indicado seria utilizar o SPOOL via sqlplus, e depois o Loader para carga ?

              Estou efetuando esse teste nesse momento ….

              Obrigado !

              #105888
              Avatar de rmanrman
              Participante

                @Andrei Rubino

                Eu faria em PL/SQL ou qualquer linguagem de programação. Nem tinha pensado em sqlplus.

                #105889
                Avatar de Andrei RubinoAndrei Rubino
                Participante

                  @rman

                  Entendi, mas iria utilizar o SPOOL para pegar os dados mesmo ?

                  Realizei o teste aqui, assim como esperado o desempenho foi muito melhor do que o cursor.

                  Eu trabalho na conversão dos banco de dados dos clientes para o nosso Oracle.
                  Primeiramente a gente faz uma conversão para o Oracle, e a segunda(definitiva) conversão a gente
                  realiza alocado no cliente, então todo tempo ganho é ótimo.

                  Me responde mais uma dúvida, o loader não desativa constraints nem triggers né ?

                  Obrigado rman

                  #105890
                  Avatar de rmanrman
                  Participante

                    @Andrei Rubino

                    Em PL/SQL é possível utilizar utl_file para gerar o arquivo texto.

                    O SQL Loader não desativa constraint nem trigger, creio que não é interessante desativar nenhuma constraint, contrario de trigger, mas realmente deve ser manual.

                    #105891
                    Avatar de Andrei RubinoAndrei Rubino
                    Participante

                      @rman
                      É verdade tem o UTL_FILE, mas acredito que com o spool vai ser mais rápido…
                      Sim, apenas desabilito as triggers para realizar a carga.

                      Obrigado !

                      #105893
                      Avatar de Sergio Mancini JuniorSergio Mancini Junior
                      Participante

                        Olá Andrei,

                        Uma outra alternativa seria gerar um flat file via Oracle External Table, utilizando a query do Cursor.

                        Na base destino você iria fazer um “Mount” do arquivo via External Table também e poderia inserir os dados através de um “INSERT AS SELECT”, com opções de utilização de várias Hints.

                        Caso necessário, pode-se utilizar Parallel Execution na criação do arquivo, o que pode acelerar o processo.

                        http://docs.oracle.com/cd/B19306_01/server.102/b14215/et_concepts.htm

                        Att,

                        #105915
                        Avatar de Andrei RubinoAndrei Rubino
                        Participante

                          @smancinijr
                          Entendi, vou estudar essa possibilidade também.
                          Irei realizar alguns testes e posto aqui o resultado depois.

                          Obrigado !

                          #105928
                          Avatar de Andrei RubinoAndrei Rubino
                          Participante

                            Olá Pessoal,
                            Realizei testes com o SPOOL vs UTL_FILE.
                            No meu caso o UTL_FILE foi muito mais eficiente.
                            Os dados gerando um arquivo de dados de 17 milhões de registros:
                            UTL_FILE: 10 minutos.
                            SPOOL : Cerca de 2h 30 min.

                            O Problema é que o SPOOL depende do tráfego da rede,
                            por isso se torna muito mais lento.

                            Obs:
                            Não cheguei a testar alternativa do @smancinijr via Oracle External Table, não posso opinar sobre ela.

                          Visualizando 12 posts - 1 até 12 (de 12 do total)
                          • Você deve fazer login para responder a este tópico.
                          plugins premium WordPress