Ok. Nao sei se desativar eh uma boa. A pergunta nesse ponto eh: Se todos 
serao atualizado, o indice nao tera que ser recriado de qualquer forma?? 
Ou o indice soh eh reriado com mudancas na estrutura da tabela?

Outra duvida, o que eh esse paralelismo? Qual o conceito disso? Como uso?

Sobre a UNDO, vou criar um datafile maior antes de fazer essa 
operacao... (Sim, o DBA sou eu mesmo. rsrs)





Em 13-07-2010 16:16, José Laurindo escreveu:
> Sim, pelo que eu entendi vc quer mesmo trabalhar na tabela inteira ( o WHERE 
> é só pra indicar o último registro lido, mas TODOS os registros tem que ser 
> lidos e atualizados pelo que entendi), então sim, vc teria um único UPDATE 
> sem WHERE - apenas, torno a repetir, ANTES DE FAZER ISSo acione o seu DBA 
> para que ele crie uma área de undo/rollback apropriada, ative paralelismo no 
> acesso à essa tabela, avalie se vale a pena desativar o índice e depois fazer 
> o rebuild em NOLOGGING, enfim...
>
>   []s
>
>     Chiappa
>
> --- Em oracle_br@yahoogrupos.com.br, Samuel Corradi<corrad...@...>  escreveu
>>
>> Mas como fazer esse comando em um update soh?
>>
>> Voce diz tirar o coteudo do loop e colocar em um UPDATE que NAO tenha a
>> clausula WHERE?
>>
>> -------------------------------------------------
>> ...
>> LOOP
>>
>> codigo := TRIM(SUBSTR(registro.f14, INSTR(registro.f14,'-',-1) + 2,
>> LENGTH(registro.f14)));
>>
>> nome := TRIM(SUBSTR(registro.f14, 1, INSTR(registro.f14,'-',-1) - 2 ));
>>
>> UPDATE sadig.mod0046 SET f14=nome || '[' || codigo || ']' WHERE
>> f1=registro.f1 and f6=registro.f6;
>>
>> END LOOP;
>> ...
>> -------------------------------------------------
>>
>> para
>>
>> -------------------------------------------------
>>
>> UPDATE sadig.mod0046
>> SET f14=TRIM(SUBSTR(f14, 1, INSTR(f14,'-',-1) - 2 )) || '[' ||
>> TRIM(SUBSTR(f14, INSTR(f14,'-',-1) + 2, LENGTH(f14))) || ']';
>>
>> -------------------------------------------------
>>
>>
>> Em 12-07-2010 14:54, José Laurindo escreveu:
>>> Oi, Samuel : primeiro de tudo, rigorosamente Não Existe isso de "o script 
>>> parar" quando redo log file enche : o que pode acontecer nesse sentido é , 
>>> se o banco est;a programado para arquivar/copiar os redo log files cheios 
>>> (archive mode) E não há espaço em disco não é a sessão, mas sim o banco 
>>> TODINHO que para - isso é Bem difícil de acontecer, mas o seu DBA é 
>>> Totalmente capaz de solucionar isso, uma mensagem BEM ESPECÍFICA é gerada 
>>> no alert do banco quando isso ocorre... COnsulte o seu DBA pra que isso 
>>> seja verificado.
>>>    Caso não seja esse o caso, aí pra mim o que está acontecendo é simples 
>>> (e esperada) ** LENTIDÃO ** por causa da (via de regra totalmente 
>>> INAPROPRIADA) programação e processamento uma iinha/registro por vez que vc 
>>> está fazendo (também conhecida como row-by-row, oo slow-by-slow, slow aqui 
>>> por motivos óbvios)...
>>>     Se vc quer performance máxima num SQL, dê os recursos necessários e 
>>> deixa o banco trabalhar : isso implicaria num primiro momento em acionar o 
>>> DBA, para que ele crie área de rollback/undo suficiente e (se adequado) 
>>> ative paralelismo e (se possível) desative eventuais triggers e índices 
>>> (com REBUILD em modo NOLOGGING posterior), E no segundo passo vc JOGA FORA 
>>> esse loop e faz o comando num UPDATE só, esse é o mantra, é o caminho, é a 
>>> Melhor Coisa quando vc quer máxima performance num SQL...
>>>    Dá uma pesquisada em http://asktom.oracle.com por SQL ROW BY ROW 
>>> PERFORMANCE que vc acha várias refs e dicas sobre isso...
>>>
>>>    []s
>>>
>>>      Chiappa
>>>
>>>
>>> --- Em oracle_br@yahoogrupos.com.br, Samuel Corradi<corradibh@>   escreveu
>>>>
>>>> Ola pessoal!
>>>>
>>>> Tenho que faz update em um campo do tipo VARCHAR2.
>>>>
>>>> Para isso fiz um PL que abre um cursor e percorrer todas linhas
>>>> alterando os valores.
>>>>
>>>> Agora, estou tendo um problema durante a atualizacao. Aparentemente, os
>>>> redo logs enchem e o sript para. Nao sei dizer exatamente o que estah
>>>> acontecendo, mas acredito que tenho que fazer um controle maior durante
>>>> esse update.
>>>>
>>>> Alguem tem alguma sugestao do que pode estar acontecendo? Alguem jah
>>>> passou por esse trabalho de atualizar muitos registros de uma tabela?
>>>>
>>>> Segue meu PL para referencia:
>>>>
>>>> ================================================
>>>>
>>>> DECLARE
>>>> CURSOR c1 IS select * from sadig.mod0046;
>>>> flag BOOLEAN DEFAULT false;
>>>> tamanho PLS_INTEGER DEFAULT 0;
>>>> codigo VARCHAR2(45);
>>>> nome VARCHAR2(85);
>>>> BEGIN
>>>>    FOR registro IN C1
>>>>    LOOP
>>>>            codigo := TRIM(SUBSTR(registro.f14, INSTR(registro.f14,'-',-1) 
>>>> + 2,
>>>> LENGTH(registro.f14)));
>>>>            nome := TRIM(SUBSTR(registro.f14, 1, INSTR(registro.f14,'-',-1) 
>>>> - 2 ));
>>>>            UPDATE sadig.mod0046 SET f14=nome || '[' || codigo || ']' WHERE
>>>> f1=registro.f1 and f6=registro.f6;
>>>>    END LOOP;
>>>> END;
>>>>
>>>> =================================================
>>>>
>>>> Obrigado!
>>>>
>>>
>>>
>>>
>>
>
>
>

Responder a