![]() |
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:
Ich hoffe einer von euch hat ne zündene Idee.
// 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; Dank im voraus. |
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:
SQL-Code:
Die vorherige Überprüfung auf Vorhandensein ist vollkommen überflüssig.
DELETE FROM computer_software
WHERE sid = :id |
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:
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.
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; Schönen Samstag noch. |
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] |
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:
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.
DBCC CHECKIDENT ('Table_1', RESEED, 222);
Ciao, Ralf |
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. |
Re: Index bei großen Datenmengen, die ständig gelöscht werde
Das hab ich doch in #2 bereits geschrieben.
SQL-Code:
Dabei stellt der Parameter id dann die Computerid dar.
DELETE FROM computer_software
WHERE sid = :id |
Re: Index bei großen Datenmengen, die ständig gelöscht werde
Zitat:
SQL-Code:
Löscht alle Datensätze bei denen die sid gleich der angegebenen "id" ist.
Delete from computer_software where sid = id
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: |
Re: Index bei großen Datenmengen, die ständig gelöscht werde
Jetzt sollte es aber klar sein :lol:
|
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 23:05 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 by Thomas Breitkreuz