DELETE-Befehl optimieren

Hallo zusammen,

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!!! :frowning:

Wer kann mir helfen die Abfrage zu beschleunigen?

Vielen Dank und viele Grüße,
squirrel

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.

Andreas

Hallo Andreas,

schonmal vielen Dank für deine Antwort - das ist ja super!!! :slight_smile: Kann es leider momentan nicht ausprobieren. Wenn ich deine Ansätze heute Abend getestet habe melde ich mich wieder!

Viele Grüße,
squirrel