Oracle - Update muy muy lento

 
Vista:

Update muy muy lento

Publicado por Marta (30 intervenciones) el 01/06/2007 13:51:44
Mi problema es muy simple. Tengo que hacer un update de una tabla para bastantes registros (a lo mejor 200.000, que tampoco son tantos, pero bueno).

UPDATE FICHERO_NAVIERA
set ESTADOCUPON= '2'
WHERE ESTADOCUPON= '13'
AND ID_FICHERO_HISTORIAL =xxxx

Como de esta forma me tarda mucho, me he creado un procedimiento para que cada 1000 registros haga un commit (por si ese fuera el problema):

DECLARE
MILLARES NUMBER(10);
BEGIN
SELECT CEIL(COUNT(*)/1000)
INTO MILLARES
FROM FICHERO_NAVIERA;

FOR I IN 1..MILLARES LOOP
UPDATE FICHERO_NAVIERA
set ESTADOCUPON= '2'
WHERE ESTADOCUPON= '13'
AND ID_FICHERO_HISTORIAL = xxx
AND ROWNUM <= 1000;
COMMIT;
END LOOP;
END;

Pero nada, me va muy muy lento.... qué puedo hacer?? es problema del update o de la base de datos??

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Update muy muy lento

Publicado por diego (39 intervenciones) el 01/06/2007 14:02:16
Ejecuta un explain plan para ver si el update te va por indices(si tienes).
Entiendo que no lo está haciendo.
Si no tienes deberías crearlos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por Marta (30 intervenciones) el 01/06/2007 14:06:31
Nunca he ejecutado un explain plan, como se hace??

gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por diego (39 intervenciones) el 01/06/2007 14:13:50
Si estas en el toad o plsql developer con f5.Si no entiendes lo que te devuelve mandamelo.
¿Tienes indices creados?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por marta (30 intervenciones) el 01/06/2007 14:19:02
Pues esto es lo que me devuelve:

SQL> ed
Escrito archivo afiedt.buf

1 EXPLAIN PLAN for UPDATE FICHERO_NAVIERA
2 SET ESTADOCUPON= '13'
3 WHERE ESTADOCUPON= '2'
4 AND ID_FICHERO_HISTORIAL = '4306'
5* AND ROWNUM <= 1000
SQL> /

Explicado.

Lo he lanzado desde SQL PLUS. No sé si se hace así.

Y sí, tengo indices creados.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por diego (39 intervenciones) el 01/06/2007 14:20:37
Desde sqlplus no me acuerdo como verlo.
¿No tienes el toad o el plsqldeveloper o similar?
Tienes que hacer el update por los indices
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por Marta (30 intervenciones) el 01/06/2007 14:22:12
Sí, tengo el TOAD. ¿cómo lo hago?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por diego (39 intervenciones) el 01/06/2007 14:23:04
Pones el update en una ventana sql y le das a f5
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por diego (39 intervenciones) el 01/06/2007 14:24:52
O le das al icono de la ambulancia.
Tienes que tener creada la tabla de explain plan
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por Marta (30 intervenciones) el 01/06/2007 14:30:06
Vale!! y como tiene que ser la tabla??

campos, tipos...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por diego (39 intervenciones) el 01/06/2007 14:39:12
Lo mas seguro es que la tengas creada.Prueba a ver si te funciona.
Sino,si estas mas comoda en slq plus aqui te mando como ejecutar el explain plan y luego verlo(adaptalo a lo tuyo)
Ejecucion del EXPLAIN :

EXPLAIN PLAN
SET STATEMENT_ID = 'Emp_Sal'
FOR SELECT ename, job, sal, dname
FROM emp, dept
WHERE emp.deptno = dept.deptno
AND NOT EXISTS
(SELECT *
FROM salgrade
WHERE emp.sal BETWEEN losal AND hisal);

Para ver el resultado puede sutilizsar este query:

SELECT LPAD(' ',2*(LEVEL-1))||operation||' '||options
||' '||object_name
||' '||DECODE(id, 0, 'Cost = '||position) "Query Plan"
FROM plan_table
START WITH id = 0 AND statement_id = 'Emp_Sal'
CONNECT BY PRIOR id = parent_id AND statement_id ='Emp_Sal';
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por diego (39 intervenciones) el 01/06/2007 14:41:17
¿Cuál es el indice/s de la tabla?.Si esta yendo por indices,es posible que sea problema de la BD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por Marta (30 intervenciones) el 01/06/2007 14:41:26
Muchas gracias. Ya lo pruebo el lunes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por Marta (30 intervenciones) el 04/06/2007 09:58:13
Esto es lo que me devuelve al hacer el explain plan.

No sé interpretarlo, qué significa???

Query Plan
--------------------------------------------------------------------------------
SELECT STATEMENT Cost = 86
SORT AGGREGATE
INDEX FAST FULL SCAN FICH_EST_HIST

FICH_EST_HIST es mi índice.

Muchas gracias por todo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por diego (39 intervenciones) el 04/06/2007 11:14:38
Esta cogiendo el índice.
Mandame el script de creacion de la tabla donde se vea todos los indices y primary keys.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por Snorre (2 intervenciones) el 13/06/2007 10:36:19
Hola compañeros,

Puede ser una opinión , pero no me suena a que el problema en la orden de update pueda ser el tema del indice. Influye pero yo tendría otras cosillas que deberíais mirar. Desde luego, como gien dice Bercyano mirar PK, FK e indices de la tabla y ver si hay que recrear alguno.

Dicha tabla tiene triggers activos? Eso si que puede ralentizar.

Probad sino a recuperar dichos registros en un array y hacer acoplamiento masivo mediante FORALL. Si es posible, pero primero ver tema de triggers.. Yo lo sufri.

Un saludo,

Snorre
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Update muy muy lento

Publicado por David Rosenblum (1 intervención) el 12/11/2015 18:36:50
Y si en vez de UPDATE simplemente haces un select con los datos que necesitas y exportas a archivo, luego creas una tabla vacía para esos datos e importas ahí? loego puede seguir trabajando con esta nueva tabla, y la anterior la puedes borrar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar