Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi große anzahl von Records löschen (https://www.delphipraxis.net/95613-grosse-anzahl-von-records-loeschen.html)

Mr.borland 10. Jul 2007 13:37

Datenbank: Nexus DB • Version: 2.0 • Zugriff über: Delphi 2006

große anzahl von Records löschen
 
hallo,

gibt es eine möglichkeit um eine große anzahl von Records sehr schnell zu löschen.
meine Tabele ist 40-100Mb groß mit bis zu 500000 Records, und möchte auf einen Schlag alle bis auf 1000 Records löschen.

zür erläuterung:
Es sind Messwerte die Für statistische Auswertung aufgesamelt werden. nun die Tabele wächst ständig
bis die Festplatte voll geschrieben ist. der USER kann aber so zusagen die datenmenge selber Reduziert.

Aber die Grundtabelle bleibt immer erhalten. nun das problem, es kann mal passieren das der USER 1 bis 2 wochen die Datenmenge nicht reduziert. ;-[
ich habe dann eine Menge Datensätze am hals, und mein system ist völligst ausgelastet.

Was ich bis her Versucht habe:

- for schleife : bis zu 1 minute
- Table SetRange : bis zu 20-25 sec.
- und der schnellste Algorithmus bis her ~10sec.
Delphi-Quellcode:
               try
         mwQuery.Close;
         mwQuery.SQL.Clear;
         mwQuery.SQL.Add(Format('delete from mwTable where ID>=%d and id<=%d',[valueStart,valueEnd]));
         nxDatabase1.StartTransaction;
         try
            mwQuery.ExecSQL;
            nxDatabase1.Commit;
         except
            nxDatabase1.Rollback;
         end;
      finally
         mwQuery.Close;
      end;
geht es noch schneller?! bin Dankebar für jede hilfe.

Bernhard Geyer 10. Jul 2007 13:48

Re: große anzahl von Records löschen
 
Ich denke nicht. Deine Indize müssen ja aktualisiert werden und das dauert nunmal.
Und Transaktionale Steuerung beschleunigt die Sache auch nicht gerade.

RavenIV 10. Jul 2007 14:05

Re: große anzahl von Records löschen
 
Du kannst versuchen, das über eine Stored Procedure zu lösen.
Die kannst Du ankicken und die Software läuft weiter, während die SP ihre Dienste macht.

Mr.borland 10. Jul 2007 14:08

Re: große anzahl von Records löschen
 
meine hauptproblem in dieser Sache ist eigentlich nicht direkt die zeit. sondern das mein system(Programm) für ca. 10-20 sec. (löschvorgang) einfriert. das ist verhärend, da ich neben bei noch Serielle und Netzwerk Komunikation überwachen muss.

In der Forschleife habe ich mal mit >> Application.ProcessMessages << probiert.

vieleicht kann mann das problem auf diese oder ähnliche weise umgehen? man tolleriert den Zeitaufwand aber versucht das system im bewegung zuhalten.

ne idee?

DAnke.

Mr.borland 10. Jul 2007 14:09

Re: große anzahl von Records löschen
 
Stored Procedure !!!

ich probiere es mal.

danke.

Tormentor32 10. Jul 2007 14:10

Re: große anzahl von Records löschen
 
Ansonsten würde ich versuchen, die Lösch-Methode in einen Thread auszulagern!

Mr.borland 10. Jul 2007 14:13

Re: große anzahl von Records löschen
 
Welche vorzüge haben den Threads gegenüber StoredProcedures? in der Beschreibung ist eine ähnliche arbeitsweise herraus zulesen.

RavenIV 10. Jul 2007 14:19

Re: große anzahl von Records löschen
 
Eine Stored Procedure ist eine Ansammlung von befehlen, die auf dem DB-Server ausgeführt werden.

Ein Thread ist eine "Abspaltung" von Deinem Programm, die quasi parallel zu Deinem Programm abgearbeitet wird.

Bernhard Geyer 10. Jul 2007 14:20

Re: große anzahl von Records löschen
 
Zitat:

Zitat von Mr.borland
Welche vorzüge haben den Threads gegenüber StoredProcedures? in der Beschreibung ist eine ähnliche arbeitsweise herraus zulesen.

Die Frage ist ob eine SP nicht genauso deine Anwendung blockiert wie bisher das direkte löschen.
Hier ist schon ein Thread besser. Aber u.U. mußt du eine neue Verbingung zur DB aufbauen da u.U. deine DB-Zugriffskompos nicht Thread-Save sind.

RavenIV 10. Jul 2007 14:25

Re: große anzahl von Records löschen
 
Bei Interbase / Firebird gibt es Execute-Stored-Procedures,die keine Ergebnismengen zurückgeben.
Diese sollten dann "nicht-blockierend" ausgeführt werden können.

Vielleicht gibt es bei Deiner DB etwas ähnliches?

alzaimar 10. Jul 2007 14:48

Re: große anzahl von Records löschen
 
Zitat:

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.

Mr.borland 10. Jul 2007 15:00

Re: große anzahl von Records löschen
 
Ja, für ein Thread brauche ich eine seperate Datenbank-Session.
ich kann allso über einen DB-Server zwei Sessions defieren die auf die selbe Tabelle zugreifen.
beim schreiben und löschen müßte ich nicht mal auf kollision achten.

zusätzlich brauche ich naturlich auch eine weitere Tabelle und eine Database.

liege ich richtig bis her?

Mr.borland 10. Jul 2007 15:02

Re: große anzahl von Records löschen
 
ich arbeite aber mit Nexus DB 2.0

alzaimar 10. Jul 2007 15:05

Re: große anzahl von Records löschen
 
Zitat:

Zitat von Mr.borland
ich arbeite aber mit Nexus DB 2.0

Worauf bzw. auf wen bezieht sich das?
Zitat:

Zitat von Mr.borland
Ja, für ein Thread brauche ich eine seperate Datenbank-Session...liege ich richtig bis her?

Yep. Wie greifst Du denn auf die DB zu? Ich sagte bereits, das man das mit ADO machen kann, ist bei Delphi mit dabei... Wenn Du per ADO-Connection eine Verbindung zum Nexus-dB-Server aufbauen kannst, dann klappt das.

Mr.borland 10. Jul 2007 15:06

Re: große anzahl von Records löschen
 
die tabelle hat einen AutoInc Spalte.

Mr.borland 10. Jul 2007 15:07

Re: große anzahl von Records löschen
 
mein frage über Threads bezieht sich auch
Bernhard Geyer schreiben

sorry!

Mr.borland 10. Jul 2007 15:09

Re: große anzahl von Records löschen
 
bezog sich auf Bernhard Geyer's schreiben. sorry

Mr.borland 10. Jul 2007 15:11

Re: große anzahl von Records löschen
 
alles klar, alzaimar. ich probiere das mal. danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 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