2010-10-07 18 views
7

Tengo una mesa muy grande, con ~ 200 millones de filas. No tenía ningún índice/pk en absoluto. Las selecciones en esta tabla estaban (obviamente) ejecutándose lentamente. Decidí crear un PK usando 3 columnas. Lo hice en un entorno de prueba que tiene una versión más pequeña de esta tabla y funcionó a las mil maravillas.Crear un índice/pk en una tabla enorme lleva demasiado tiempo. Estoy usando Oracle. ¿Cómo sé si va bien?

lo tanto, antes de ir a casa hice un ALTER TABLE HUGETABLE Agregar restricción PRIMARY KEY PK_HUGETABLE (ID1, ID2, ID3);

Esperaba que funcionara durante la noche, pero ya han pasado más de 24 horas y todavía está funcionando.

Sé que si hubiera conservado el ID de sesión antes de comenzar mi consulta, podría seguirlo en V $ SESSION_LONGOPS. Pero no lo hice.

¿Hay alguna forma de comprobar cómo va mi consulta o cuánto tiempo todavía tardará?

Respuesta

7

Debería poder consultar V $ SESSION_LONGOPS. Si ejecuta algo así como

SELECT sid, serial#, start_time, sofar, totalwork, time_remaining, message 
    FROM v$session_longops 
WHERE time_remaining > 0 

es probable que vea una sola sesión que se inició ayer y las otras columnas debe corroborar que con indicios de que la sesión ha hecho mucho trabajo. El MENSAJE también debería indicar algo así como un escaneo completo en HUGETABLE.

+0

No pude encontrarlo. Encontré un montón de proceso, pero no pude identificar el mío. Así que me di por vencido y lo cancelé :) Detendré todo durante el fin de semana y lo intentaré de nuevo. Esta vez tendré la identificación de la sesión antes de comenzar el trabajo. Gracias de todos modos. – Michael

+2

La próxima vez, defina el índice con PARALELO n, donde n es un grado aceptable de paralelismo en su sistema. Cuando termine, modifique el índice a NOPARALLEL. Además, si no está utilizando Data Guard y puede realizar una copia de seguridad de la base de datos cuando termine, use la cláusula NOLOGGING. –

0

No necesita recordar su identificación de sesión para monitorear el estado de una declaración. Como Justin sugirió, no debería haber demasiadas consultas de ejecución larga desde el día anterior. También puede especificar la hora de inicio para reducir los resultados.

select * from V$SESSION_LONGOPS where time_remaining > 0 and start_time > <'your run date/time here'>; 

Además 'PARALELO n' opción, usted debe considerar el uso de la opción de 'en línea', así si va a crear (o reconstrucción), mientras que un índice concurrente de lectura/escritura están teniendo lugar en la mesa enorme.

Cuestiones relacionadas