Zitat von
RavenIV:
Bei Interbase / Firebird gibt es Execute-Stored-Procedures,die keine Ergebnismengen zurückgeben.
Diese sollten dann "nicht-blockierend" ausgeführt werden können.
Das kann man mit
ADO realisieren (TADOCommand.ExecuteOptions := [eoAsyncExecute])
Allerdings würde ich erstmal die
DB analysieren.
Wenn die mwTable sehr viele Einträge hat UND die spalte ID nicht indexiert ist, dann muss der Server ja alle Zeilen durchlaufen.
Wenn das also so ist (viele Zeilen, kein Index), dann dürfte ein Index auf der Spalte ID schon sehr viel bringen.
Wenn die Bedingung 'ID>=x AND ID <= y' (schreib lieber 'ID BETWEEN x AND y', ist hübscher) sehr viele Zeilen löscht, und hinterher verhältnismäßig wenig Zeilen übrig bleiben, dann könntest Du so vorgehen
SQL-Code:
select *
into #TempTable
-- Das ist MSSQL-Dialekt: Schreibe in eine temporäre Tabelle namens '#TempTable'
from mwTable
where not (ID
between x
and y)
-- Also die Zeilen sichern, die NICHT gelöscht werden sollen
truncate table mwTable
insert into mwTable
select *
from #TempTable
drop table #TempTable
Wenn die Tabelle allerdings über AutoInc-Spalten verfügt, dann ist das so nicht machbar (man muss noch ein paar Zeilen dazupacken). Im Prinzip merkst du dir die Zeilen, die nicht gelöscht werden sollen, schmeißt die gesamte Tabelle auf den Müll (den Inhalt), und kopierst anschließend die gemerkten Zeilen zurück in die Originaltabelle. Das kann im Einzelfall schneller gehen.
Ich lese gerade, das vermutlich die 2.Variante für Dich in Frage kommt.