› Fóruns › Banco de dados Oracle › Performance em alteração de dados em massa
- Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 11 anos atrás por
Fábio Prado.
-
AutorPosts
-
26 de fevereiro de 2015 às 12:18 am #107390
Tytto
ParticipantePreciso atualizar os dados para corrigir a integridade dos registros.
Tenho as seguintes tabelas:
GLTEFDAD com 23 milhões de registros , com índices não-únicos no “id_conteudo” e “id_tef + dado”
– GLTEFCON com 20 milhões de registros, com índice único no “id_conteudo” e indice não-único no “conteúdo”
O comando sql que FUNCIONA perfeitamente, mas dá um custo de 345.028, o que vai demorar vários dias para rodar:
—————————————–
declare
Vcontador number;
CURSOR c_tef is
SELECT ID_TEF
FROM GLTEFDAD
GROUP BY ID_TEF;Cursor Vdados is
select
a.id_tef,
a.dado,
(SELECT MIN (c.id_conteudo) FROM GLTEFCON c WHERE c.id_conteudo < a.id_conteudo AND exists (SELECT 1 FROM GLTEFCON b WHERE b.id_conteudo = a.id_conteudo and c.conteudo = b.conteudo)) id_conteudo from GLTEFDAD a WHERE EXISTS (SELECT 1 FROM GLTEFCON c WHERE c.id_conteudo < a.id_conteudo AND exists (SELECT 1 FROM GLTEFCON b WHERE b.id_conteudo = a.id_conteudo and c.conteudo = b.conteudo)); BEGIN Vcontador := 0; dbms_output.put_line('Vai começar'); For Ve in Vdados Loop update GLTEFDAD set id_conteudo = ve.id_conteudo where id_tef = ve.id_tef and dado = ve.dado; Vcontador := Vcontador +1; if Vcontador > 1000 then
dbms_output.put_line(‘Comitou mais 1000’);
Commit;
Vcontador := 0;
end if;End Loop;
COMMIT;
dbms_output.put_line(‘Terminou’);END;
—————————————–
Alguém tem uma dica de como melhorar o custo dessa atualização de dados?
Lembrando que é uma rotina para ajustar a integridade dos dados, e nesse caso toda a tabela precisa ser verificada.Desde já agradeço a ajuda.
16 de abril de 2015 às 4:57 pm #107456Fábio Prado
Participante@Tytto,
Uma boa dica para otimizar instruções SQL é tentar, de um modo geral, resolver o seu problema com SQL puro, ou seja, não utilize PL/SQL neste seu UPDATE. Ao invés de montar um cursor para ler linha a linha os dados de origem, faça um UPDATE com uma subquery correlacionada como nos exemplos do link http://glufke.net/oracle/viewtopic.php?t=7008.
Outra coisa que você poderia testar é dropar os índices antes do UPDATE e recriá-los depois. O tempo costuma melhorar se vc não precisar destes índices no SELECT da subquery correlacionada.
[]s
-
AutorPosts
- Você deve fazer login para responder a este tópico.
› Fóruns › Banco de dados Oracle › Performance em alteração de dados em massa