Forma óptima de eliminar filas especificadas de Oracle
Tengo un proyecto que necesita eliminar ocasionalmente varias decenas de miles de filas de una de las seis tablas de diferentes tamaños, pero que tienen alrededor de 30 millones de filas entre ellas. Debido a la estructura de los datos que me han dado, no sé cuál de las seis tablas tiene la fila que se debe eliminar, así que tengo que ejecutar todas las eliminaciones en todas las tablas. He creado un ÍNDICE contra la columna de ID para intentar acelerar las cosas, pero se puede eliminar si eso acelera las cosas.
Mi problema es que parece que no puedo encontrar una manera eficiente de realizar la eliminación. Para los propósitos de mi prueba, estoy ejecutando 7384 eliminar filas contra una sola tabla de prueba que tiene aproximadamente 9400 filas. He probado varias soluciones de consulta posibles en Oracle SQL Developer:
7384 separadoDELETE
declaraciones tomaron203 segundos:
<code>delete from TABLE1 where ID=1000001356443294; delete from TABLE1 where ID=1000001356443296; etc... </code>
7384 separadoSELECT
declaraciones tomaron57 segundos:
<code>select ID from TABLE1 where ID=1000001356443294 select ID from TABLE1 where ID=1000001356443296 etc... </code>
7384 separadoDELETE from (SELECT)
declaraciones tomaron214 segundos:
<code>delete from (select ID from TABLE1 where ID=1000001356443294); delete from (select ID from TABLE1 where ID=1000001356443296); etc... </code>
1 SELECT
declaración que tiene 7384OR
cláusulas en el dónde tomó127.4s:
<code>select ID from TABLE1 where ID=1000001356443294 or ID = 1000001356443296 or ... </code>
1 DELETE from (SELECT)
declaración que tiene 7384OR
cláusulas en el dónde tomó74.4s:
<code>delete from (select ID from TABLE1 where ID=1000001356443294 or ID = 1000001356443296 or ...) </code>
Si bien el último puede ser el más rápido, luego de más pruebas aún es muy lento cuando se amplía de la tabla de 9000 filas a solo una tabla de 200,000 filas (que aún es <1% del tamaño del conjunto de tablas final) donde se toma la misma declaración14mins correr. Mientras que> 50% más rápido por fila, aún se extrapola hasta aproximadamente un día cuando se ejecuta contra el conjunto de datos completo. Tengo la buena autoridad de que el software que usamos para hacer esta tarea podría hacerlo en aproximadamente20mins.
Así que mis preguntas son:
¿Hay una mejor manera de eliminar?¿Debo usar una ronda deSELECT
¿Declaraciones (es decir, como la segunda prueba) para descubrir en qué tabla se encuentra una fila determinada y luego eliminar las consultas de eliminación? Incluso eso parece bastante lento pero ...¿Hay algo más que pueda hacer para acelerar las eliminaciones? No tengo acceso o conocimiento a nivel de DBA.