![]() |
Datenbank: Noch keine ;) • Version: --- • Zugriff über: Query Komponente
Access alternative für Paradox?
Hallo,
auf der Suche nach einer alternativen Datenbank für Paradox habe ich mich schon umfassend hier informiert. Firebird wird ja bei jedem zweiten Thema angesprochen, aber ich verstehe den Umgang mit der Datenbank irgendwie nicht. Daher bin ich jetzt auf die Idee gekommen eine Access Datenbank zu nutzen. Dazu habe ich jetzt aber noch ein paar Fragen: 1. Benötigt Access einen Server oder sonst etwas wie die BDE? 2. Kann ich die DB Datei einfach in den Ordner der Applikation stecken und auf jedem beliebigen Rechner darauf zugreifen? 3. Kann ich mit den Komponenten (TTable, TDataSource, TQuery, etc.) auf die Access DB zugreifen? Danke Thomas |
Re: Access alternative für Paradox?
Um Paradox als "Datenbank"-Backend zu ersetzen würde ich dir zunächst zur
![]() Nun zu deinen Fragen:
Grüße Mikhal |
Paradox über 300 mal schneller als Access?
In einer Sekunde schaffe ich ca. 22500 Datensätze in eine Paradox-Datenbank zu schreiben, aber nur ca. 70 Datensätze in eine Access-Datenbank. Zum Test habe ich jeweils eine leere Paradox- und Access-Datenbank mit je 3 Feldern ID (AutoWert), SerNr (LongInteger) und SerTx (Text, Länge: 16). Wenn ich bei der Access-Datenbank die ID von "AutoWert" auf "LongInteger" umstelle und manuell (siehe Auskommentierung) mit Werten versorge bringe ich es auf ca. 120 Datensätze pro Sekunde. Immer noch verdammt langsam ... Übrigens, das Ganze läuft auf einem Notebook mit Pentium 4 mobile mit 1,4 GHz und 256 MB RAM.
Hier der Code:
Delphi-Quellcode:
Weis jemand wie ich das schneller hin kriege?
procedure TForm1.Timer1Timer(Sender: TObject);
begin WriteFlag := False; Timer1.Enabled := False; end; // Einfügen in Access-Tabelle procedure TForm1.ButtonAccessClick(Sender: TObject); var ID, SerSt, SerNr: LongInt; SerTx: String; begin // Max ID ermitteln ---------------------------------------------------------- // ADOQuery1.Close; // ADOQuery1.SQL.Text := 'Select max(ID) as maxID From Tabelle1'; // ADOQuery1.Open; // ID := ADOQuery1.FieldByName('maxID').AsInteger; // --------------------------------------------------------------------------- ADODataSet1.Open; ADODataSet1.Last; SerSt := ADODataSet1.FieldByName('SerNr').AsInteger; SerNr := SerSt; // --------------------------------------------------------------------------- WriteFlag := True; Timer1.Interval := StrToInt(Edit8.Text) * 1000; Timer1.Enabled := True; // Daten einfügen ------------------------------------------------------------ ADODataSet1.Edit; while (WriteFlag) do begin // inc(ID); inc(SerNr); SerTx := 'XYZ' + RightStr('00000000' + IntToStr(SerNr), 8); ADODataSet1.Append; // ADODataSet1.FieldByName('ID').AsInteger := ID; ADODataSet1.FieldByName('SerNr').AsInteger := SerNr; ADODataSet1.FieldByName('SerTx').AsString := SerTx; Application.ProcessMessages; end; ADODataSet1.Post; // --------------------------------------------------------------------------- ShowMessage(IntToStr(SerNr - SerSt) + ' Datensätze eingefügt'); end; // Einfügen in Paradox-Tabelle procedure TForm1.ButtonParadoxClick(Sender: TObject); var SerSt, SerNr: LongInt; SerTx: String; begin Table1.Open; Table1.Last; SerSt := Table1.FieldByName('SerNr').AsInteger; SerNr := SerSt; // --------------------------------------------------------------------------- WriteFlag := True; Timer1.Interval := StrToInt(Edit9.Text) * 1000; Timer1.Enabled := True; // --------------------------------------------------------------------------- Table1.Edit; while (WriteFlag) do begin inc(SerNr); SerTx := 'XYZ' + RightStr('00000000' + IntToStr(SerNr), 8); Table1.Append; Table1.FieldByName('SerNr').AsInteger := SerNr; Table1.FieldByName('SerTx').AsString := SerTx; Application.ProcessMessages; end; Table1.Post; // --------------------------------------------------------------------------- ShowMessage(IntToStr(SerNr - SerSt) + ' Datensätze eingefügt'); end; Vielen Dank. |
Re: Access alternative für Paradox?
DBASe und Paradox sind zeilenorientiert, deswegen ist Paradox beim zeilenweisen einfügen (table1.append) so schnell. Ich denke mal, dass Access mengenorientiert arbeitet, da solltest du eher einen Benchmark mit sql-Anweisungen machen (inser into table1 values (...)).
|
Re: Access alternative für Paradox?
Danke "ak1",
mit SQL ist funktioniert das Ganze etwa um den Faktor 2,5 schneller.
Delphi-Quellcode:
Nun hab ich noch ein Problem, was mit "ADODataSet1.LookUp" zwar schneller funktioniert als mit SQL aber immer noch viel zu langsam. Ich muss 100000 Datensätze durchsuchen, welche Seriennummern in aufsteigender Reihenfolge enthalten. Es kann sein, das irgendwo dazwischen eine Seriennummer fehlt. Genau die muss ich herausfinden. Zum Durchsuchen von 20000 Datensätzen brauch ich mit "LookUp" ca. 2,7 Sekunden, mit SQL dauert es eine Ewigkeit.
procedure TForm1.Button26Click(Sender: TObject);
var i, SerNr, SerSt, Cnt: LongInt; SerTx: String; begin // Max SerNr ermitteln ------------------------------------------------------- ADOQuery1.Close; ADOQuery1.SQL.Text := 'Select max(SerNr) as maxSerNr From Tabelle1'; ADOQuery1.Open; SerSt := ADOQuery1.FieldByName('maxSerNr').AsInteger; SerNr := SerSt; // Anzahl der Datensätze ----------------------------------------------------- Cnt := StrToInt(Edit3.Text); // --------------------------------------------------------------------------- T1 := Time; for i := 0 to Cnt - 1 do begin inc(SerNr); SerTx := 'IKM' + RightStr('00000000' + IntToStr(SerNr), 8); ADOQuery1.Close; ADOQuery1.SQL.Text := 'INSERT INTO Tabelle1 (SerNr, SerTx) ' + 'VALUES (:PSerNr, :PSerTx)'; ADOQuery1.Parameters.ParamByName('PSerNr').Value := SerNr; ADOQuery1.Parameters.ParamByName('PSerTx').Value := SerTx; ADOQuery1.ExecSQL; end; T2 := Time; // --------------------------------------------------------------------------- showMessage(IntToStr(Cnt) + ' Datensätze'); showTime; end; Mit LookUp:
Delphi-Quellcode:
Mit SQL:
procedure TForm1.Button8Click(Sender: TObject);
var i, SerNr: LongInt; V: Variant; begin SerNr := ADODataSet1.FieldByName('SerNr').AsInteger; T1 := Time; for i := 0 to 99999 do begin V := ADODataSet1.Lookup('SerNr', SerNr, 'SerNr'); if not (VarType(V) in [varNull]) then inc(SerNr) else Break; end; T2 := Time; ShowTime; ShowMessage('Seriennummer: ' + IntToStr(SerNr)); end;
Delphi-Quellcode:
procedure TForm1.Button17Click(Sender: TObject);
begin T1 := Time; ADOQuery4.Close; ADOQuery4.SQL.Text := 'Select SerNr From Tabelle1 ' + 'Where (SerNr + 1) Not In (Select SerNr From Tabelle1)'; ADOQuery4.Open; T2 := Time; ShowTime; end; |
Re: Access alternative für Paradox?
Entweder würde ich dafür einen outer join verwenden, oder eine query welche alle DS mit der entsprechenden Sortierung auflistet, dann läufst du die Query durch und vergleichst den Aktuellen Datensatz immer mit dem Vorgänger bzw. umgekehrt. Das dürfte viel schneller gehen als deine Wahnsinns not in sql-Abfrage.
|
Re: Access alternative für Paradox?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 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-2025 by Thomas Breitkreuz