Quiero saber la manera más eficiente de actualizar cada fila en una tabla Oracle extremadamente grande para una sola columna. Por ejemplo:
update mytable set mycolumn=null;
o:
update mytable set mycolumn=42;
Mi conocimiento puede muy bien ser rancio. Lo que hago es alterar la tabla para soltar la columna. Luego, modifico la tabla para agregar la columna con un valor predeterminado del nuevo valor que quiero usar. Luego, modifico la tabla para eliminar el valor predeterminado de la columna. Creo que esto es mucho más rápido que simplemente ejecutar una actualización, pero tengo la sensación de que hay un método mejor.
Respuestas:
Mucho depende de la otra actividad en esta tabla mientras realiza esta actualización masiva. Espero que tenga algún tipo de entorno de prueba donde pueda ejecutar algunas muestras de lo que le gustaría hacer y tener una idea de cuál es la mejor manera. Lo intentaré:
update table set column_name = blah
;updating the column=blah
y confirmar cada X actualizaciones (tal vez 10000). Puede paralelizar este código copiándolo y haciéndolo copiar en una sección separada de Claves primarias.Tuvimos un problema muy similar con una tabla que se usó de manera muy activa en el sistema OLTP y pudimos paralelizarla 5x y se ejecutó sin que el usuario bloqueara el impacto en una tabla de filas de más de 100 MM que se comprometía cada 10000. No dijo cómo qué tamaño tiene su mesa o qué tipo de aplicación está ejecutando, pero este tipo de solución puede ser adecuada para usted.
fuente
Para un ayuno
UPDATE
, asegúrese de no tener ningún disparador que se esté disparando.Asegúrese de volver a habilitar solo los que desee cuando haya terminado.
También es posible que se encuentre con la sobrecarga del mantenimiento del índice. Intente reconstruir sus índices por separado. Para hacer eso, la respuesta aquí por pappes debería ser útil: /programming/129046/disable-and-later-enable-all-table-indexes-in-oracle
Estoy repitiendo la respuesta de pappes aquí como referencia. (Tenga en cuenta que este comando SPOOL hace suposiciones sobre su plataforma y entorno).
Importar ...
fuente
eliminar el índice actualizar la columna Devuelve el índice. pero si la columna contiene el mismo valor para todas las filas, puede soltar el índice.
fuente
Si no tiene limitación de espacio, puede crear una nueva tabla, igual que su tabla con su nueva columna agregada a esa tabla y eliminar la tabla anterior:
fuente
Pruebe varias secuencias de actualización / confirmación. Insertar / Actualizar / Eliminar demasiadas filas sin una confirmación conduce a una gran carga de E / S. Se puede optimizar bastante conociendo los tamaños de bloque y los tamaños de registro y demás.
Para eliminar datos completos en una tabla,
truncate table x
es mejor quedelete from x
. También la purga crea otra carga de trabajo de proceso.Editar: puede usar la
inmemory
opción, cargar la tabla en la memoria en formato de columna y luego realizar la actualización. realmente depende de las relaciones y la estructura de su base de datos. Ver este artículo .fuente
truncate
odelete
sería de alguna ayuda.