Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

update a partir de select muy grande

Estas en el tema de update a partir de select muy grande en el foro de Oracle en Foros del Web. Hola, quiero realizar un update a partir de un select count muy grande. La sentencia está bien construida y funciona, pero si el select arroja ...
  #1 (permalink)  
Antiguo 03/12/2007, 10:16
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años
Puntos: 1
update a partir de select muy grande

Hola, quiero realizar un update a partir de un select count muy grande. La sentencia está bien construida y funciona, pero si el select arroja demasiados registros la sentencia tarda demasiado, e incluso no sé si se atasca.

¿Hay algún modo de realizar commit cada x actualizaciones? Se me ha ocurrido implementarlo a mí, mediante el uso de cursores, pero me gustaría saber si hay algún modo automático (por ejemplo decirle en la sesión, justo antes de ejecutar la sentencia, algo como "COMMIT cada 20.000 líneas).

Gracias
  #2 (permalink)  
Antiguo 03/12/2007, 13:22
Avatar de Sir Matrix  
Fecha de Ingreso: octubre-2000
Ubicación: Dentro de mi cabeza. ono?
Mensajes: 1.264
Antigüedad: 23 años, 6 meses
Puntos: 3
Re: update a partir de select muy grande

Hola, creo que no es posible colocar un COMMIT cada 20.000 líneas en un select, ya que este tipo de procesos los hace por lotes, no registro a registro.

Una alternativa puede ser hacer el cursor e ir haciendo distintos selects..

...where rownum< 100
...where rownum< 200 and rownum >=100
.. etc, etc..

aqunque no se para que pueda servir :P
saludos
__________________
|||| ))>_<(( ||||
www.webmagic.cl <-- esta pagina está mala, no la busquen
  #3 (permalink)  
Antiguo 03/12/2007, 13:45
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Re: update a partir de select muy grande

Sir Matrix tiene razón.
Hasta donde llego yo, no es posible tirar un update masivo y que te haga COMMIT cada N registros. Lo de los cursores es buena idea.
Por otra parte disiento con él en la utilidad. Puede server entre otras cosas para que no te exploten los segmentos de rollback y no te salte el famoso ORA-01555 ( Aunque la 10g y supongo que la 11 gestionan muy bien ese tema y es dificil que pase eso, aunque no imposible )
Bye
  #4 (permalink)  
Antiguo 03/12/2007, 15:03
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Re: update a partir de select muy grande

Hola,

No, no se puede hacer un commit cada n registros en un update directo.

Ahora no me queda claro cual es la preocupacion principal, es decir, si son los tiempos, entoces con un cursor haciendo un loop y commit cada 20.000 registros, por seguir tu ejemplo, tardara mucho mas que un update directo. Si el update tiene un buen plan de ejecucion, entonces sera lo mas rapido.

Si la preocupacion es el tamaño de la transaccion, y estas utilizando segmentos de rollback, entonces dimensiona un segmento acorde al tamaño de la transaccion y utiliza la siguiente intruccion para forzar el update a un segmento de rollback en especifico.

Código:
set transaction use rollback segment nombre_del_segmento_de_rollback;
Si estas utilizando segmentos de undo, dimensiona el tablespace de undo al tamaño de la transaccion y deja que Oracle se las arregle solo.

Si piensas que la operacion se atasca puedes consultar la vista v$session_longops (operaciones de mas de 6 segundos)

Código:
SELECT s.sid,
       s.serial#,
       s.machine,
       TRUNC(sl.elapsed_seconds/60) || ':' || MOD(sl.elapsed_seconds,60) elapsed,
       TRUNC(sl.time_remaining/60) || ':' || MOD(sl.time_remaining,60) remaining,
       ROUND(sl.sofar/sl.totalwork*100, 2) progress_pct
FROM   v$session s,
       v$session_longops sl
WHERE  s.sid     = sl.sid
AND    s.serial# = sl.serial#;
Saludos
  #5 (permalink)  
Antiguo 17/12/2007, 14:43
 
Fecha de Ingreso: noviembre-2003
Mensajes: 59
Antigüedad: 20 años, 5 meses
Puntos: 0
Re: update a partir de select muy grande

si el update que vas a realizar corresponde a la misma tabla que vas a usar el cursor, no puedes usar el commit, pues el FOR UPDATE no lo permite.

saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 03:17.