Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delete-Abfrage optimieren? (https://www.delphipraxis.net/191049-delete-abfrage-optimieren.html)

bra 2. Dez 2016 11:06

Datenbank: Firebird • Version: 2.5 • Zugriff über: ?

Delete-Abfrage optimieren?
 
Ich habe zwei Tabellen mit jeweils sehr vielen Einträgen (teilweise mehrere Mio). Ich möchte jetzt alle Einträge aus table1 löschen, die den Einträgen aus table2 entsprechen:

Code:
delete from table1 where id in (select id from table2);
Diese Abfrage dauert sehr lange (mehrere Minuten). Lässt sich das irgendwie optimieren?

nahpets 2. Dez 2016 11:15

AW: Delete-Abfrage optimieren?
 
Eventuell:
SQL-Code:
delete from table1 where exists (select id from table2 where table1.id = table2.id);

bra 2. Dez 2016 11:18

AW: Delete-Abfrage optimieren?
 
Leider nicht, die Abfrage dauert genauso lange :?

Ritsch 2. Dez 2016 11:20

AW: Delete-Abfrage optimieren?
 
Eventuell damit?

Code:
DELETE a
FROM a -> Erste Tabelle
INNER JOIN b -> Zweite Tabelle
      ON b.ID = a.ID

bra 2. Dez 2016 11:45

AW: Delete-Abfrage optimieren?
 
Das funktioniert leider nicht in Firebird, scheinbar unterstützt der keine JOINs in DELETE :evil:

mkinzler 2. Dez 2016 11:52

AW: Delete-Abfrage optimieren?
 
Wenn das öfters gemacht werden soll, würde ich entsprechende Indizes anlegen.

bra 2. Dez 2016 12:00

AW: Delete-Abfrage optimieren?
 
Die IDs sind in beiden Tabellen die Primary Keys, haben also schon Indizes.

Uwe Raabe 2. Dez 2016 12:04

AW: Delete-Abfrage optimieren?
 
Wenn die Anzahl der zu löschenden Einträge relativ klein ist, könnte man über einen JOIN diese Menge abfragen und dann einfach die DELETE-Anweisung programmatisch aufbauen. Wäre auch als Stored Procedure denkbar.

jobo 2. Dez 2016 12:19

AW: Delete-Abfrage optimieren?
 
Die meisten RDBMS sind per Default nicht dafür konfiguriert, schnell löschen zu können. Falls es eine einmalige Sache ist (Migration) oder so, muss man da einfach durch.
Was u.a. je nach Datenmodell viel Last produzieren kann, ist nicht primär das Löschen der Datensätze selbst, sondern die zugehörige Überwachung von Constraints bzw. foreign key Constraints und das nachziehen (all) der zugehörigen, abhängigen Indices.
Abhilfe würde demnach verschaffen, solche Constraints zu deaktivieren oder zu löschen, ebenso alle "Nebenindices" der zu löchenden Tabelle, die nichts mit den Foreign Keys zu tun haben, sondern lediglich irgendwelche Suchen beschleunigen.
Anschließend dann neu anlegen (Constraints, Indices).
Constraints zu löschen, birgt natürlich ein gewisses Risiko.

Als weiche Maßnahme würde es ggF. auch helfen, vorhandene Untermengen (laut foreign keys), separat bzw. zuerst/unabhängig zu löschen.

P.S.:
Kenne mich mit FB in der Praxis nicht so aus, vlt taugt sowas in der Art, um gezielt Indices zu aktivieren / deaktivieren:
http://www.firebirdfaq.org/faq274/

Ghostwalker 2. Dez 2016 12:48

AW: Delete-Abfrage optimieren?
 
Eine andere Möglichkeit wär, die DS die nicht gelöscht werden sollen raus zu filtern, in eine eigene Tabelle, org. Tabelle löschen und die andere umbenennen.

Gerade wenn es viele zu löschende DS sind, sollte das u.U. schneller funktionieren :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz