Optimale Möglichkeit, angegebene Zeilen von Oracle zu löschen

Ich habe ein Projekt, das gelegentlich mehrere Zehntausend Zeilen aus einer von sechs Tabellen unterschiedlicher Größe löschen muss, zwischen denen sich jedoch etwa 30 Millionen Zeilen befinden. Aufgrund der Struktur der angegebenen Daten weiß ich nicht, welche der sechs Tabellen die zu löschende Zeile enthält, sodass alle Löschvorgänge für alle Tabellen ausgeführt werden müssen. Ich habe einen INDEX gegen die ID-Spalte erstellt, um die Dinge zu beschleunigen, aber er kann entfernt werden, wenn dies die Dinge beschleunigt.

Mein Problem ist, dass ich anscheinend keinen effizienten Weg finde, um das Löschen tatsächlich durchzuführen. Für die Zwecke meines Tests führe ich 7384 Löschzeilen für eine einzelne Testtabelle aus, die ungefähr 9400 Zeilen enthält. Ich habe eine Reihe möglicher Abfragelösungen in Oracle SQL Developer getestet:

7384 getrenntDELETE Aussagen getroffen203 Sekunden:

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

7384 getrenntSELECT Aussagen getroffen57 Sekunden:

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

7384 getrenntDELETE from (SELECT) Aussagen getroffen214 Sekunden:

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

1 SELECT Anweisung, die 7384 hatOR klauseln im wo genommen127,4s:

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

1 DELETE from (SELECT) Anweisung, die 7384 hatOR klauseln im wo genommen74,4s:

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

Während der letzte möglicherweise der schnellste ist, ist er nach weiteren Tests immer noch sehr langsam, wenn er von der 9000-Zeilen-Tabelle auf nur eine 200.000-Zeilen-Tabelle hochskaliert wird (was immer noch <1% der endgültigen Tabellengröße ist), für die dieselbe Anweisung gilt14 min zu rennen. Das ist zwar pro Zeile> 50% schneller, rechnet sich aber immer noch bis zu einem Tag, wenn das gesamte Dataset abgeglichen wird. Ich bin der festen Überzeugung, dass die Software, mit der wir diese Aufgabe erledigt haben, es in etwa schaffen könnte20 min.

Meine Fragen sind also:

Gibt es eine bessere Möglichkeit zum Löschen?Soll ich eine Runde verwenden?SELECT Anweisungen (d. h. wie der zweite Test), um herauszufinden, in welcher Tabelle sich eine bestimmte Zeile befindet, und um dann Löschabfragen abzuschießen? Auch das sieht ziemlich langsam aus, aber ...Kann ich noch etwas tun, um das Löschen zu beschleunigen? Ich habe keinen DBA-Zugang oder keine Kenntnisse.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage