habe eine DB mit 2 Tabellen (“table1”, “table2”). Beide Tabellen haben eine gleiche Spalte (“id”), und jeweils noch eine content-Spalte, also:
table1
id
content1
table2
id
content2 (“content2” ist im Prinzip für das Beispiel irrelevant)
Das Problem: ich möchte eine bestimmte Menge von Einträgen aus beiden Tabellen löschen! Dabei soll aber nur ein Merkmal (WHERE content1 = “”)aus table1 verwendet werden!!!
Habe auch eine Lösung, welche aus zwei Schritten besteht:
(1.)
DELETE FROM table1
WHERE table1.content1 = “”
(2.)
DELETE FROM table2
WHERE table2.id NOT IN (SELECT id FROM table1)
Das klappt wie gesagt alles wunderbar, aber NOT IN ist einfach grottenlangsam!!!
Wie groß ist der Anteil von Datensätzen, die in table1 zu löschen sind, im Verhältniss zur Gesamtanzahl?
Falls gering, dann wäre das ja ein besseres Kriterium. Also:
test=# select * from squirrel1;
id | content
----+--------------
1 | bla1
2 | soll bleiben
(2 Zeilen)
Zeit: 0,157 ms
test=*# select * from squirrel2;
id | content
----+-------------------
1 | bla1
2 | soll auch bleiben
(2 Zeilen)
Zeit: 0,239 ms
test=*# delete from squirrel2 where id in (select id from squirrel1 where content='bla1');
DELETE 1
Zeit: 0,476 ms
test=*# delete from squirrel1 where content='bla1';
DELETE 1
Zeit: 0,274 ms
test=*# select * from squirrel1;
id | content
----+--------------
2 | soll bleiben
(1 Zeile)
Zeit: 0,336 ms
test=*# select * from squirrel2;
id | content
----+-------------------
2 | soll auch bleiben
(1 Zeile)
Zeit: 0,208 ms
Anderer Ansatz mit einem Join:
delete from squirrel2 using squirrel1 where squirrel2.id=squirrel1.id and squirrel1.content='bla1';
Und dann squirrel1 wie gehabt.
Probier es aus und schaue Dir die Explains an. Rückinfo wäre nett.
schonmal vielen Dank für deine Antwort - das ist ja super!!! Kann es leider momentan nicht ausprobieren. Wenn ich deine Ansätze heute Abend getestet habe melde ich mich wieder!