AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Index bei großen Datenmengen, die ständig gelöscht werden?

Index bei großen Datenmengen, die ständig gelöscht werden?

Ein Thema von Piro · begonnen am 18. Apr 2009 · letzter Beitrag vom 24. Apr 2009
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

Index bei großen Datenmengen, die ständig gelöscht werden?

  Alt 18. Apr 2009, 16:41
Datenbank: SQL 2008 Express • Zugriff über: ADO
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.
Miniaturansicht angehängter Grafiken
loeschfehler_323.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.390 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 18. Apr 2009, 16:52
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#3

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

  Alt 18. Apr 2009, 17:26
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.390 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 18. Apr 2009, 17:30
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 [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
926 Beiträge
 
Delphi 10.3 Rio
 
#5

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

  Alt 18. Apr 2009, 17:42
Hallo,

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

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
Ralf Kaiser
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#6

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

  Alt 18. Apr 2009, 17:58
@ DeddyH: Wie sieht denn so eine Bedingung aus?

@ Alfi001: Vielen Dank. Ich denk mal drauf rum.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.390 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 18. Apr 2009, 18:00
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
926 Beiträge
 
Delphi 10.3 Rio
 
#8

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

  Alt 18. Apr 2009, 18:02
Zitat von daywalker299:
Wie sieht denn so eine Bedingung aus?
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"...
Ralf Kaiser
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.390 Beiträge
 
Delphi 11 Alexandria
 
#9

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

  Alt 18. Apr 2009, 18:03
Jetzt sollte es aber klar sein
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#10

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

  Alt 18. Apr 2009, 18:32
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:38 Uhr.
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