- Este tópico contém 11 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 10 meses atrás por
dralves.
-
AutorPosts
-
29 de abril de 2009 às 11:55 pm #86519
dralves
ParticipanteAmigos,
estou executando uma consulta via TOAD em uma tabela de 100 milhões de registro e tento salva-lá em em arquivo txt, porém durante o salvamento do arquivo aparece a seguinte mensagem “snaphot”.
Pelo que pude averiguar junto ao DBA é que o registro que estou tentando salvar está sofrendo alteração.
Existe alguma possibilidade de salvar este registro que está sofrendo alteração e importa-lo somente no final?
Desde já agradeço
30 de abril de 2009 às 12:21 am #86520Manoel872
ParticipanteExato o que o DBA ti informou, então faça o seguinte…. crie uma logica para pegar o maximo e o minimo valor da pk da tabela… e crie uma estrutura de loop que será executada ate o valor da variavel de controle do loop seja igual ao ao valor final… fazendo o processamendo da query de 2000 em 2000 registro.
LOOP
Exit when valorpkmin >= valorpkmax
LOOP
valorpkmin = valorpkmin + 2000;
for i in (Select * from tabela
where pk between valorpkmin – 2000 and valorpkmin;) loop
end loop;
end loop;
end loop;Acho q isso deu para ter uma ideia
30 de abril de 2009 às 12:25 am #86521Manoel872
ParticipanteErrata:
LOOP
Exit when valorpkmin >= valorpkmax
valorpkmin = valorpkmin + 2000;
for i in (Select * from tabela
where pk between valorpkmin – 2000 and valorpkmin) loop
end loop;
end loop;[quote=”Manoel872″:2y8qi46o]Exato o que o DBA ti informou, então faça o seguinte…. crie uma logica para pegar o maximo e o minimo valor da pk da tabela… e crie uma estrutura de loop que será executada ate o valor da variavel de controle do loop seja igual ao ao valor final… fazendo o processamendo da query de 2000 em 2000 registro.
LOOP
Exit when valorpkmin >= valorpkmax
LOOP
valorpkmin = valorpkmin + 2000;
for i in (Select * from tabela
where pk between valorpkmin – 2000 and valorpkmin;) loop
end loop;
end loop;
end loop;Acho q isso deu para ter uma ideia[/quote]
30 de abril de 2009 às 12:31 am #86522dralves
ParticipanteComo vou saber o valorpk da minha tabela?
Eu nã tenho esse campo na mesma.30 de abril de 2009 às 12:50 am #86523Manoel872
ParticipanteAmigo,
Conversa com DBA a melhor forma de você fazer essa exportação para txt seria fazendo um bloco anonimo em PL/SQL usando utl_file.put_line para exporta ou utilizar rotinas de export(SQL*Loader), da uma olhada no forum tem bastante informação sobre exportação.Att,
Manoel Jr.
30 de abril de 2009 às 12:50 am #86524vieri
Participantepede para o dba aumentar o undo_retention,
temporariamente…30 de abril de 2009 às 12:58 am #86525dralves
ParticipanteEsse é o problema isso vai demorar muito e vamos gastar um dinheiro de desenvolvimento. Já dei uma olhada mais o UTL_FILE.PUT_LINE só rodam no servidor. Como eu sou usuario somente tenho acesso de leitura. Sendo assim gostaria de deixar rodando esse comando que o colega sugeriu e tentar pegar o arquivo amanhã.
Vocês poderiam me ajudar com essa questão? Basicamente o que eu quero é salvar o resultado do grid em um arquivo txt na minha máquina.
Ah estou utilizando o TOAD 7.4
30 de abril de 2009 às 5:13 am #86528CleitonHanzen
ParticipanteOpá..
Pelo que entendi vc quer gerar esse arquivo para importar posteriormente no SQL Server, certo?
Se for isso, utilize o Integration Services da Microsoft. Vai ser muito mais rápido e menos “custoso” do que programar para gerar um arquivo, para daí importar no SQL Server.
Flws.
30 de abril de 2009 às 4:03 pm #86532dralves
ParticipanteJá tentei pelo integration services, mas não deu certo. Procurei salvar novamente a consulta e o erro persistiu. Dá uma olhada.
The following error has occurred:
ORA-01555: snapshot too old: rollback segment number 1 with name “RBS1” too small
30 de abril de 2009 às 4:29 pm #86533CleitonHanzen
ParticipanteOpá…
Entaum vc vai ter de seguir a dica do outro profissional (Manoel), que é “quebrar” a tabela em quantidade menor de valores (por exemplo, separar por uma quantidade x de meses), aí ao invés de vc jogar 100milhões de linhas de um única vez para o arquivo, você vai jogando em “pedaços”, por exemplo de 1milhão em 1 milhão ou até quantidade menores.
Caso considerar isto impossível, converse com o seu DBA e verifique se existe algum horário da semana/final de semana que tenha menos carga no teu banco (tende a ter menos atualizações) e ainda assim solicite para ele colocar a undo_retention com valor maior.
30 de abril de 2009 às 4:34 pm #86534dralves
ParticipanteVc tem algum exemplo? Ele comentou de pegar o min e o max do valorpk que não entendi o que é.
Vc poderia me auxiliar? A consulta é essa e já faço alguns filtros.
SELECT ACCOUNT_ID, ACTION_ID, EXECUTION_DATE, STATUS
FROM ICS_E_ACTION_LAUNCHER A
WHERE STATUS IN (‘ACTIVE’,’OK’)
AND EXISTS (SELECT B.ACCOUNT_ID,MAX(B.EXECUTION_DATE)
FROM ICS_E_ACTION_LAUNCHER B
WHERE A.ACCOUNT_ID = B.ACCOUNT_ID
AND B.STATUS IN (‘ACTIVE’,’OK’)
GROUP BY B.ACCOUNT_ID HAVING MAX(B.EXECUTION_DATE) = A.EXECUTION_DATE)5 de maio de 2009 às 4:42 pm #86565dralves
ParticipanteGalera,
Consegui pegar o valor minimo e máximo do campo PK da tabela em questão. Porém o que eu estou querendo é pegar a ultima ação de cobrança para cada cliente conforme a consulta postada anteriormente.
Pelo que foi sugerido pelo Manoel não iria funcionar visto que estou querendo pegar a ultima ação para cada cliente.
-
AutorPosts
- Você deve fazer login para responder a este tópico.