Optymalny sposób usuwania określonych wierszy z Oracle

Mam projekt, który od czasu do czasu wymaga usunięcia kilkudziesięciu tysięcy wierszy z jednej z sześciu tabel o różnych rozmiarach, ale między nimi jest około 30 milionów wierszy. Ze względu na strukturę danych, które otrzymałem, nie wiem, która z sześciu tabel ma wiersz, który należy w nim usunąć, więc muszę uruchomić wszystkie usuwanie na wszystkich tabelach. Zbudowałem INDEKS przeciwko kolumnie ID, aby przyspieszyć proces, ale można go usunąć, jeśli to przyspieszy.

Mój problem polega na tym, że nie mogę znaleźć skutecznego sposobu na usunięcie. Na potrzeby moich testów używam 7384 usuń wiersze z pojedynczej tabeli testowej, która ma około 9400 wierszy. Przetestowałem wiele możliwych rozwiązań zapytań w Oracle SQL Developer:

7384 osobnoDELETE wyciągnięto oświadczenia203 sekundy:

<code>delete from TABLE1 where ID=1000001356443294;
delete from TABLE1 where ID=1000001356443296;
etc...
</code>

7384 osobnoSELECT wyciągnięto oświadczenia57 sekundy:

<code>select ID from TABLE1 where ID=1000001356443294
select ID from TABLE1 where ID=1000001356443296
etc...
</code>

7384 osobnoDELETE from (SELECT) wyciągnięto oświadczenia214 sekundy:

<code>delete from (select ID from TABLE1 where ID=1000001356443294);
delete from (select ID from TABLE1 where ID=1000001356443296);
etc...
</code>

1 SELECT oświadczenie, które ma 7384OR klauzule w miejscu, w którym zostały podjęte127,4:

<code>select ID from TABLE1 where ID=1000001356443294 or ID = 1000001356443296 or ...
</code>

1 DELETE from (SELECT) oświadczenie, które ma 7384OR klauzule w miejscu, w którym zostały podjęte74,4:

<code>delete from (select ID from TABLE1 where ID=1000001356443294 or ID = 1000001356443296 or ...)
</code>

Podczas gdy ostatnia może być najszybsza, po dalszym testowaniu jej wciąż bardzo powolny, gdy przeskalowany z tabeli 9000 wierszy do nawet 200 000 tabel wierszy (co jest nadal <1% ostatecznego rozmiaru zestawu tabel), gdzie ta sama instrukcja trwa14 minut biegać. Podczas gdy> 50% szybszy na wiersz, to wciąż ekstrapoluje do około jednego dnia, gdy jest uruchamiany z pełnym zestawem danych. Mam dobry autorytet, że oprogramowanie, którego używaliśmy do tego zadania, mogło to zrobić20 minut.

Moje pytania to:

Czy istnieje lepszy sposób na usunięcie?Czy powinienem użyć rundySELECT instrukcje (np. drugi test), aby dowiedzieć się, w której tabeli znajduje się dany wiersz, a następnie zlikwidować zapytania? Nawet to wygląda dość wolno, ale ...Czy jest jeszcze coś, co mogę zrobić, aby przyspieszyć usuwanie? Nie mam dostępu ani wiedzy na poziomie DBA.

questionAnswers(4)

yourAnswerToTheQuestion