Ótima maneira de excluir linhas especificadas do Oracle
Eu tenho um projeto que precisa excluir ocasionalmente várias dezenas de milhares de linhas de uma das seis tabelas de tamanhos variados, mas que têm cerca de 30 milhões de linhas entre eles. Devido à estrutura dos dados que recebi, não sei qual das seis tabelas tem a linha que precisa ser excluída, portanto, preciso executar todas as exclusões em todas as tabelas. Eu construí um INDEX contra a coluna ID para tentar acelerar as coisas, mas ele pode ser removido se isso acelera as coisas.
Meu problema é que não consigo encontrar uma maneira eficiente de realmente executar a exclusão. Para o propósito do meu teste, estou executando 7384 linhas de exclusão em uma única tabela de teste, que possui cerca de 9400 linhas. Eu testei um número de possíveis soluções de consulta no Oracle SQL Developer:
7384 separarDELETE
declarações levou203 segundos:
<code>delete from TABLE1 where ID=1000001356443294; delete from TABLE1 where ID=1000001356443296; etc... </code>
7384 separarSELECT
declarações levou57 segundos:
<code>select ID from TABLE1 where ID=1000001356443294 select ID from TABLE1 where ID=1000001356443296 etc... </code>
7384 separarDELETE from (SELECT)
declarações levou214 segundos:
<code>delete from (select ID from TABLE1 where ID=1000001356443294); delete from (select ID from TABLE1 where ID=1000001356443296); etc... </code>
1 SELECT
declaração que tem 7384OR
cláusulas no onde tomou127.4s:
<code>select ID from TABLE1 where ID=1000001356443294 or ID = 1000001356443296 or ... </code>
1 DELETE from (SELECT)
declaração que tem 7384OR
cláusulas no onde tomou74,4s:
<code>delete from (select ID from TABLE1 where ID=1000001356443294 or ID = 1000001356443296 or ...) </code>
Enquanto o último pode ser o mais rápido, após testar ainda muito lento quando ampliado da tabela de 9000 linhas para apenas uma tabela de 200.000 linhas (que ainda é <1% do tamanho final do conjunto de tabelas) onde a mesma declaração14 minutos para correr. Embora seja> 50% mais rápido por linha, ainda é possível extrapolar até cerca de um dia ao ser executado em relação ao conjunto de dados completo. Tenho certeza de que o software que usamos para fazer essa tarefa poderia ser feito em cerca de20 minutos.
Então minhas perguntas são:
Existe uma maneira melhor de excluir?Devo usar uma rodada deSELECT
instruções (ou seja, como o segundo teste) para descobrir em qual tabela uma determinada linha está e, em seguida, eliminar consultas excluídas? Até parece um pouco lento mas ...Há mais alguma coisa que eu possa fazer para acelerar as exclusões? Eu não tenho acesso ou conhecimento em nível de DBA.