Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensätze vergleiche (https://www.delphipraxis.net/96898-datensaetze-vergleiche.html)

alzaimar 2. Aug 2007 21:42

Re: Datensätze vergleiche
 
Prinzipiell hat Hansa recht. Nur ist IB/FB keine DBISAM-DB, sondern ein RDBMS. Hier wird mit Mengen gearbeitet. Die verhalten sich ohne Index intern genauso wie eine DBISAM, aber bei richtigen Indexen wird es verdammt schnell. Dann greifen eben B-Tree-Algorithmen, die pro Datensatz gegen O(1) gehen, also nahezu unabhängig von der Anzahl der Datensätze ist. Bei 800.000 macht das schon den Unterschied zwischen Stunden und Sekunden aus. Ich traue mir zu, bei 1-2 Mio Datensätzen ein Self-Join in ein paar Sekunden hinzubekommen.

Aber mir is det sowieso allet ejal weil ick morjen in Uuuurlaub fliegen tu! :mrgreen: :mrgreen:

grenzgaenger 2. Aug 2007 23:25

Re: Datensätze vergleiche
 
@hansa: tja, weil man dann nicht mehr sortieren braucht. so 'n ascii file, sortiert das BS mit 'n paar parametern problemlos... und dann läuft der vergleich, auch ohne DB in 'n paar sekunden durch.

@alzaimar: mit den ständigen zugriff auf die DB, kann es schon länger brauchen. aber bei zwei sortierten sequentziellen dateien (master --> slave) ist die laufzeit O(n). er liest exakt 2x 800'000 datensätze und die sache ist erledigt. da brauchts auch keinen index oder so was ...nur sortiert müssen die beiden tabellen sein.

einen solchen fall, hatte ich schon lange nicht mehr. aber damals mit COBOL lieb das ganze in 'n paar sekunden (auf 'ner alten architektur [286 war es glaub ich]) durch. ansonsten einfach mal nach den stichwörtern "normierte programmierung", "gruppenwechsel" oder "sequentielle dateiverarbeitung" suchen. da stehen die standardprobleme (vor der datenbankzeit) mit sicherheit ausführlich beschrieben...

grüsse und noch 'n schönen abend
gg

Hansa 3. Aug 2007 12:04

Re: Datensätze vergleiche
 
Liste der Anhänge anzeigen (Anzahl: 2)
Mehr ist das nicht :

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, FIBDataSet, pFIBDataSet, FIBDatabase, pFIBDatabase,
  FIBQuery, pFIBQuery, pFIBStoredProc;

type
  TForm1 = class(TForm)
    Database: TpFIBDatabase;
    Transaction: TpFIBTransaction;
    Test1DS: TpFIBDataSet;
    Test2DS: TpFIBDataSet;
    Button1: TButton;
    Memo1: TMemo;
    TestSP: TpFIBStoredProc;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
  i := 0;
  Test1DS.close;
  Test1DS.SelectSQL.Text := 'SELECT * FROM TEST1';
  Test1DS.Open;
  while not Test1DS.Eof do begin
    i := i + 1;
    TestSP.ParamByName('Feld1').AsString := Test1DS.FieldByName ('Feld1').AsString;
    TestSP.ParamByName('Feld2').AsString := Test1DS.FieldByName ('Feld2').AsString;
    TestSP.ParamByName('Fled3').AsString := Test1DS.FieldByName ('Fled3').AsString;
    TestSP.ParamByName('Feld4').AsString := Test1DS.FieldByName ('Feld4').AsString;
    TestSP.ParamByName('Feld5').AsString := Test1DS.FieldByName ('Feld5').AsString;
    TestSP.ParamByName('Fled6').AsString := Test1DS.FieldByName ('Fled6').AsString;
    TestSP.ExecProc;
    Memo1.Lines.Add(IntToStr (i));
    Test1DS.Next;
  end;
  Transaction.Commit;
  Database.Close;
  showmessage ('fertig !');
  Close;
end;

end.
Inkl. übernommene Schreibfehler. :mrgreen: Im Anhang sind 2 DBs. Da drin ist auch die SP. TESTDB2.FDB ist der Ursprungszustand TESTDB.FDB der Zustand der DB nach Programmlauf. Und Grenzgänger : sortiert ist da nichts. :-D

grenzgaenger 3. Aug 2007 17:24

Re: Datensätze vergleiche
 
klar hansa, es geht auch ohne sortieren. da erschlägt man dann das problem mit mehr rechenleistung :-) . aber das hat man ja heutzutage :-)

die lösung mit den zwei sortierten flat files, kommt mit vielleicht 50kb hauptspeicher aus und braucht keine datenbank sondern nur zwei open und readln... ;-)

das ging etwa so...
Delphi-Quellcode:
open master; open slave;
master.first; slave.first;
while not master.eof do
begin
 if master.record > slave.record then
 begin
  writeln('gelöschter slave record: ', slave.record);
  slave.next;
 end
 else
  if master.record = slave.record then
  begin
   writeln('master record = slave record');
   slave.next;
  end
  else
  begin //master.record < slave.record
   writeln('neuer slave record', slave.record);
  end;
 master.next;
end;
while not slave.eof do //noch datensätze in slave übrig?
begin
 writeln('neuer slave record: ', slave.record);
 slave.next;
end;

close master; close slave;
das hier wär da auch schon der ganze code ;-) . also so komplex ist das mit den zwei sortierten flat fies gar nicht und da sortiert auch sehr schnell ;-)

grüsse und noch 'n schönes weekend
gg


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:06 Uhr.
Seite 4 von 4   « Erste     234   

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