2012-05-12 29 views
8

Necesito agregar dos columnas de FECHA a una tabla ya existente. Pero lleva mucho tiempo y tengo que matar el proceso. Lo extraño es que pude agregar esas columnas a las otras tablas en la misma base de datos momentáneamente. La mayoría de esas tablas son más grandes que la que tengo problemas tanto con los datos como con los recuentos de columnas. ¿Qué debo hacer para poder agregar esas nuevas columnas?Oracle - Agregar columnas a una tabla requiere para siempre

+2

¿Qué versión de Oracle? ¿Está agregando un valor predeterminado o solo está agregando la columna? ¿Qué tan grande es la mesa? ¿Qué es "muy largo"? Horas? ¿Dias? –

+0

Es Oracle 10g. Sí, estoy agregando SYSDATE como valor predeterminado a una de esas columnas. La tabla tiene 3.923.327 registros con 11 columnas. Me llevó más de 6 minutos y simplemente interrumpí el proceso. –

+0

¿Cuántas filas hay en esa tabla? –

Respuesta

8

así es como he resuelto el problema. Antes, estaba especificando un valor predeterminado para las columnas justo en el momento de agregarlas. Pero luego agregué las columnas sin valores predeterminados. Después de agregar las columnas, especifiqué el valor predeterminado y se ejecutó inmediatamente sin esperar más. Muchas gracias @Justin Cave por su pista sobre el valor predeterminado. Ese fue el punto clave.

No tengo dudas de que está relacionado con el hecho de que al especificar el valor predeterminado en el momento de agregar la columna ese valor predeterminado se escribe en todos los registros insertados anteriormente. Así que si hay 5 millones de registros en la tabla, esa tabla se actualizará para establecer el valor predeterminado para la columna recién agregada para todas las filas. Actualizar 5 millones de registros es costoso, como uno podría adivinar. Pero si el valor predeterminado se establece después de agregar una columna, entonces el valor de esa nueva columna en las filas insertadas anteriormente será NULO, por lo que no se realizará ninguna actualización.

+0

interesante que añadir el valor predeterminado más tarde fue mucho más rápido ... –

+2

@Jens - Eso se debe a la adición de un valor predeterminado más adelante no afecta a las filas existentes, mientras que al agregar una nueva columna, el valor por defecto se debe establecer en cada fila - a menos que el valor predeterminado sea NULO, en cuyo caso Oracle no tiene que visitar las filas existentes. –

+4

Cabe señalar que en Oracle 11g, agregar una columna con un valor predeterminado ya no tiene este problema (Oracle no actualiza todas las filas existentes, sino que simplemente actualiza los metadatos). –

2

También me enfrenté a este problema al agregar una columna varchar2 (4000) sin valor predeterminado una a 61K tabla de filas en Oracle 11g. Después de 30 minutos, la columna aún no se agregó.

Me trataron de abortar la operación y vuelve a intentar, pero que todavía no terminó.

Lo que funcionó:
Intenté agregar una columna numérica en su lugar, que tomó una fracción de segundo. Lo dejó caer.
Luego traté de agregar una columna varchar2 (1), que tomó una fracción de segundo. Lo dejó caer.
Luego traté de agregar una columna varchar2 (4000) nuevamente, y solo tomó una fracción de segundo.

tonto "solución", pero tal vez esto también funciona para cualquier otra persona frente a este problema.

+0

La gente votando esto, ¿esto funcionó? Sería interesante saber ... – Wouter

Cuestiones relacionadas