- Este tópico contém 11 respostas, 3 vozes e foi atualizado pela última vez 11 anos, 1 mês atrás por Andrei Rubino.
-
AutorPosts
-
17 de setembro de 2013 às 4:23 pm #105877Andrei RubinoParticipante
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 !!!
17 de setembro de 2013 às 10:10 pm #105878rmanParticipante@Andrei Rubino
Posta a descrição das 2 tabelas. Isso é uma manutenção pontual ou você irá automatizar isso para rodar regularmente?
18 de setembro de 2013 às 12:13 am #105879Andrei RubinoParticipante@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)===================================================================================================================================
18 de setembro de 2013 às 4:28 pm #105881rmanParticipante@Andrei Rubino
Verifique a possibilidade de inserir os dados via sql loader.
18 de setembro de 2013 às 8:11 pm #105887Andrei RubinoParticipante@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 !
18 de setembro de 2013 às 9:04 pm #105888rmanParticipante@Andrei Rubino
Eu faria em PL/SQL ou qualquer linguagem de programação. Nem tinha pensado em sqlplus.
18 de setembro de 2013 às 11:05 pm #105889Andrei RubinoParticipante@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
18 de setembro de 2013 às 11:27 pm #105890rmanParticipante@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.
19 de setembro de 2013 às 12:07 am #105891Andrei RubinoParticipante@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 !
20 de setembro de 2013 às 2:02 am #105893Sergio Mancini JuniorParticipanteOlá 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,
25 de setembro de 2013 às 3:14 pm #105915Andrei RubinoParticipante@smancinijr
Entendi, vou estudar essa possibilidade também.
Irei realizar alguns testes e posto aqui o resultado depois.Obrigado !
30 de setembro de 2013 às 2:34 am #105928Andrei RubinoParticipanteOlá 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. -
AutorPosts
- Você deve fazer login para responder a este tópico.