Autor Beitrag
Tobi482
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Mo 28.07.08 11:20 
Hi Leute,

ich bin ein Anfänger was Datenbanken angeht. Für mein erstes Projekt brauchte ich eine Datenbank die ohne Server oder Zusatz-Komponenten läuft. Alles soll in einer Exe mitgeliefert werden.

Für diesen Zweck hat sich aus meiner Sicht die Absolute Database angebotenn.
www.componentace.com...bsolute_database.htm

Ich habe mehere Tage gebraucht um alles zu integrieren. Zuvor hatte ich eine eigene Struktur mit Pointern gebasteltet die sehr effektiv gearbeitet hat. Da ich jedoch Angst vor kollidierenden Zugriffen, also Synchronisationsproblemen, hatte kam die Entscheidung zu einer Datenbank, die diese Probleme regeln sollte.

Nun kam ein herber Rückschlag. Die Absolute Database ist Fast um den Faktor 10 langsamer (9.68), als meine Pointerstruktur. Ich kann mir nicht vorstelle, dass Datenbanken die normalerweise viel größere Datenmengen bearbeiten so langsam sind.

Ich denke der Fehler liegt an mir. Dies ist der Code mit dem ich die Datenbank anspreche. Habe ich evtl einen Fehler oder etwas unnötiges eingebaut?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
     //evtl schneller wenn unischtbar
     log.Visible := False;

     for i := 0 to 4000 do
     begin
          AddLog(inttostr(i) + ': ' + DB.GetItemName(i));
     end;

     //evtl schneller wenn unischtbar
     log.Visible := True;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Function TTDatabase.GetItemName(ItemID:Word):String;
begin
     //Rückgabewert setzen
     Result := 'UnkownItem';

     //Suche den Eintrag
     FindQuery.SQL.Text := 'SELECT * FROM ItemName WHERE (ID = ' + IntToStr(ItemID)  + ')';
     FindQuery.Open;

     //Abbrechen, Wenn keiner oder mehrere Records gefunden wurden
     if FindQuery.RecordCount <> 1 then exit;

     //Namen auslesen
     Result := FindQuery.FieldByName('Text').AsString;
end;


Liegt das Problem an meinem Code?
Ist die Absolute Database einfach nur langsam?
Welche alternativen habe ich?

Bin für jeden Kommentar dankbar

Mit freundlichen Grüßen
Tobi
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 28.07.08 12:40 
Wieso sollte ein Programm, das mit Daten arbeitet, die auf der Festplatte liegen, schneller sein, also deine 'Pointer' Struktur?

Befülle deine Pointerstruktur mal mit 100.000.000 Datensätzen und vergleiche dann nochmal.

_________________
Na denn, dann. Bis dann, denn.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mo 28.07.08 13:20 
Hast du bei deiner Datenbanktabelle einen Index gesetzt? Denn die Datenbank muss bei dieser Abfrage jeden Datensatz anpacken und das entsprechende Feld vergleichen. Selbst dann, wenn bereits 30 gefunden wurden. Denke das ist bei deiner Pointerstruktur vermutlich nicht der Fall. Deswegen würde ich auf das Feld ID mal einen Index setzen. Das sollte die Sache schon mal beschleunigen.

Und was du noch bedenken solltest. Datenbanken sind eher auf größere Datenmengen ausgelegt. Wenn du aber eine Struktur hast die auf einen bestimmten Fall optimiert ist, dann wird eine allgemein gehaltene Datenbank da vermutlich nicht wirklich rankommen können.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Mo 28.07.08 13:41 
außerdem hab ich da ne sehr große bremse gesehen:
du listest die artikel 0 bis 4000
Für jeden verwendest du eine Suchabfrage-->4000 mal die Ganze DB-Durchsuchen!

Du solltest es min. so machen: FindQuery.SQL.Text := 'SELECT * FROM ItemName WHERE (ID = ' + IntToStr(ItemID)  + ') LIMIT 1';
Oder gleich:
ausblenden Delphi-Quelltext
1:
FindQuery.SQL.Text := 'SELECT * FROM ItemName WHERE (ID >=0 AND ID<=4000) ORDER BY ID';					

und dann alles in ner Schleife ausgeben. Schon hast du nur noch eine Abfrage statt 4000
Tobi482 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Mi 30.07.08 09:28 
Danke für eure schnelle Hilfe :D
Werde versuchen den Code mit eurer Hilfe zu optimieren.
Falls es noch Probleme gibt melde ich mich wieder.

NOCH MAL EIN GROßES DANKESCHÖN

Mit freundlichen Grüßen
Tobi