![]() |
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:
Diese Abfrage dauert sehr lange (mehrere Minuten). Lässt sich das irgendwie optimieren?
delete from table1 where id in (select id from table2);
|
AW: Delete-Abfrage optimieren?
Eventuell:
SQL-Code:
delete from table1 where exists (select id from table2 where table1.id = table2.id);
|
AW: Delete-Abfrage optimieren?
Leider nicht, die Abfrage dauert genauso lange :?
|
AW: Delete-Abfrage optimieren?
Eventuell damit?
Code:
DELETE a
FROM a -> Erste Tabelle INNER JOIN b -> Zweite Tabelle ON b.ID = a.ID |
AW: Delete-Abfrage optimieren?
Das funktioniert leider nicht in Firebird, scheinbar unterstützt der keine JOINs in DELETE :evil:
|
AW: Delete-Abfrage optimieren?
Wenn das öfters gemacht werden soll, würde ich entsprechende Indizes anlegen.
|
AW: Delete-Abfrage optimieren?
Die IDs sind in beiden Tabellen die Primary Keys, haben also schon Indizes.
|
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.
|
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: ![]() |
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 17:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz