- This topic has 1 reply, 2 voices, and was last updated 9 years, 7 months ago by Fábio Prado.
Viewing 2 posts - 1 through 2 (of 2 total)
Viewing 2 posts - 1 through 2 (of 2 total)
- You must be logged in to reply to this topic.
Preciso 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.
@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