Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Index bei großen Datenmengen, die ständig gelöscht werden? (https://www.delphipraxis.net/132740-index-bei-grossen-datenmengen-die-staendig-geloescht-werden.html)

Piro 18. Apr 2009 16:41

Datenbank: SQL 2008 Express • Zugriff über: ADO

Index bei großen Datenmengen, die ständig gelöscht werden?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe mal ne Frage in bezug auf den Primären Index einer Tabelle. Die Tabelle enthält die Software (ca. 150 pro Computer) von ca. 1300 Computer.

Auf jedem Computer läuft ein Client, der die Software in die Datenbank zweimal am Tag schreibt. Dazu habe ich folgende Logik.

1. Client verbindet sich mit der Datenbank
2. Check, ob es Softwareeinträge für den Computer gibt
2.1 Wenn ja, werden sie alle gelöscht
3. Neue Software wird in die Datenbank geschrieben (Methode: Append)

Ich sehe da folgendes Probelm, welches ich nicht gelöst bekomme. Am Anfang wird der Index noch ok sein aber irgendwann wird der Integer Typ des Index der DB überlaufen (Wertebereich erreicht). Was könnte ich machen bzw. wie kann ich das vermeiden ohne die Logik zu ändern.

Hatte schon versucht, ohne Primären Index zu arbeiten. Aber dann klappt das Löschen nicht und es kommt vereinzelt zur Fehlermeldung. Siehe Anhang.

Hier mein Code, um die Daten in die Tabelle zu bekommen.
Delphi-Quellcode:
// Software
   try
     DSData.Close;
     DSData.CommandText := 'Select * from computer_software where sid = ' + id + ' order by name'; // order by name, damit ich weiß wo der Fehler kommt
     DSData.Open;
     if DSData.RecordCount > 0 then
       for i := 0 to DSData.RecordCount - 1 do
         DSData.Delete;

     for i := 0 to max_ASoftware do
     begin
       if ASoftware[i].name = '' then
         break;

       DSData.Append;
       DSData.FieldByName('name').AsString         := ASoftware[i].name;
       DSData.FieldByName('version').AsString      := ASoftware[i].version;
       DSData.FieldByName('installedon').AsDateTime := ASoftware[i].installedon;
       DSData.FieldByName('sid').AsString          := id;
       DSData.Post;
     end;
     DSData.Close;
     CreateLogFile('Software Information',AppPath,0);
   except
     CreateLogFile('Software Information failed',AppPath,0);
   end;
Ich hoffe einer von euch hat ne zündene Idee.

Dank im voraus.

DeddyH 18. Apr 2009 16:52

Re: Index bei großen Datenmengen, die ständig gelöscht werde
 
Ich weiß gerade nicht aus dem Kopf, wie groß so ein Index ist, aber bei 32 Bit sind das über 2 Milliarden, das sollte doch eine gewisse Zeit ausreichen. Außerdem erschließt sich mir Deine Logik nicht so ganz.
Zitat:

1. Client verbindet sich mit der Datenbank
2. Check, ob es Softwareeinträge für den Computer gibt
2.1 Wenn ja, werden sie alle gelöscht
3. Neue Software wird in die Datenbank geschrieben (Methode: Append)
Wieso löschst Du nicht einfach die Einträge, die in Deiner aktuellen Liste nicht vorhanden sind und machst auf die anderen ein Update? Und selbst wenn das nicht möglich ist, könntest Du das Löschen aber anders machen.
SQL-Code:
DELETE FROM computer_software
WHERE sid = :id
Die vorherige Überprüfung auf Vorhandensein ist vollkommen überflüssig.

Piro 18. Apr 2009 17:26

Re: Index bei großen Datenmengen, die ständig gelöscht werde
 
Danke für die Schnelle Antwort.

Ich überprüfe doch nur, ob Einträe vorhanden sind. Wenn ja lösche ich alle.
Delphi-Quellcode:
 DSData.Close;
 DSData.CommandText := 'Select * from computer_software where sid = ' + id + ' order by name';
 DSData.Open;
 if DSData.RecordCount > 0 then
   for i := 0 to DSData.RecordCount - 1 do
     DSData.Delete;
Das mit dem Überprüfen gegen die aktuellen Softwareliste ist mir auch schon in den Sinn gekommen, wollte halt nur nicht so viel Gedanken hineinstecken und hatte mich für die Wahl des Komplettlöschens entschieden. Dann werde ich mich mal mit dem Gedanken auseinandersetzen. Ist vielleicht doch die bessere Lösung. Somit würde ich den Tabellen Index nicht unnötig aufblähen.

Schönen Samstag noch.

DeddyH 18. Apr 2009 17:30

Re: Index bei großen Datenmengen, die ständig gelöscht werde
 
Du musst nicht prüfen, ob Einträge vorhanden sind. Wenn Du eine Bedingung angibst, macht das DBMS das schon automatisch für Dich.

[edit] Und ohne Bedingung löscht es Dir alle :mrgreen: [/edit]

Ralf Kaiser 18. Apr 2009 17:42

Re: Index bei großen Datenmengen, die ständig gelöscht werde
 
Hallo,

du kannst mit dem folgenden SQL Statement den AutoIncrementwert auf einen bestimmten Wert sezten:

SQL-Code:
DBCC CHECKIDENT ('Table_1', RESEED, 222);
Hier wird der Wert des Zählers aktuell auf 222 gesetzt. Das bedeutet, dass der nächste eingefügte Datensatz die ID 223 erhalten wird. Vorher solltest du natürlich sicherstellen, dass die neue ID nicht doch noch irgendwo in der Tabelle enthalten ist. Ausserdem bekommst du natürlich Probleme, wenn diese ID in anderen Tabellen noch als Fremdschlüssel benutzt wird. So eine Änderung sollte man also nur dann durchführen, wenn man sichergestellt hat, dass sie keine Auswirkungen auf den Rest der Datenbank hat.

Ciao,
Ralf

Piro 18. Apr 2009 17:58

Re: Index bei großen Datenmengen, die ständig gelöscht werde
 
@ DeddyH: Wie sieht denn so eine Bedingung aus?

@ Alfi001: Vielen Dank. Ich denk mal drauf rum.

DeddyH 18. Apr 2009 18:00

Re: Index bei großen Datenmengen, die ständig gelöscht werde
 
Das hab ich doch in #2 bereits geschrieben.
SQL-Code:
DELETE FROM computer_software
WHERE sid = :id
Dabei stellt der Parameter id dann die Computerid dar.

Ralf Kaiser 18. Apr 2009 18:02

Re: Index bei großen Datenmengen, die ständig gelöscht werde
 
Zitat:

Zitat von daywalker299
Wie sieht denn so eine Bedingung aus?

SQL-Code:
Delete from computer_software where sid = id
Löscht alle Datensätze bei denen die sid gleich der angegebenen "id" ist.

EDIT1: Warum erst die Daten in ein Dataset einlesen??? Mit ADO kann man doch auch beliebige SQL-Scripte direkt auf dem Server ausführen, da spart man dann eine ganze Menge Netzwerk-Traffic zwischen Programm und Datenbank

EDIT2: Wo ware denn jetzt wieder der "rote Kasten"... :wall:

DeddyH 18. Apr 2009 18:03

Re: Index bei großen Datenmengen, die ständig gelöscht werde
 
Jetzt sollte es aber klar sein :lol:

Piro 18. Apr 2009 18:32

Re: Index bei großen Datenmengen, die ständig gelöscht werde
 
Das war mir schon klar mit dem Löschen. Das was du geschrieben hast als SQL Befehl habe ich als DataSet Befehl auch geschrieben.

Ich dachte es gäbe noch eine andere Möglichkeit.

Also ich werde jetzt folgendes Clientseitig machen:
1. Alle Softwareeinträges des Computers (sid = id) aus der DB lesen
2. Gegen die aktuell ermittelte Software prüfen und Flags setzen.
3. Anhand des Flags den Softwareeintrag hinzufügen, editieren oder löschen

Vielen Dank für eure Hilfe.

Schönen Abend.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 Uhr.
Seite 1 von 2  1 2   

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