Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi tabelle wird riesengroß ... (https://www.delphipraxis.net/19920-tabelle-wird-riesengross.html)

grayfox 10. Apr 2004 21:27


tabelle wird riesengroß ...
 
hi folks!

ich muss mich leider mit D4 standard mit access-tabellen befassen. dazu verwende ich die nativen ado-komponenten 2.1
so weit bin ich mit ihnen zufrieden, nur die tabellen werden beim einfügen von datensätzen unnatürlich gross.
10000 datensätze mit einem longinteger und einem varchar(15) verursachen eine tabellengrösse von rund 1,6 MB - nach der kompression durch ms-access beträgt die grösse wieder annehmbare 400 kb.
die 1,6 MB sind nicht das problem, das verkraftet meine HD schon noch, aber ich möchte (muss) rund 12 mio datensätze eintragen.
übersehe ich ich irgendetwas?

meine prozeduren sehen zur zeit so aus:

Delphi-Quellcode:
ConString:= 'Provider=Microsoft.Jet.OLEDB.4.0;'
  + 'Data Source=%s;Jet OLEDB:Engine Type=4';

procedure TMainDlg.Tab_anlegenClick(Sender: TObject);
var
  aCon: _Connection;
  vRows: OleVariant;
  i, MaxRec: LongInt;
  c1, c2: String;
begin
  c1:= 'CREATE TABLE TestTbl2 (ID INT NOT NULL PRIMARY KEY, '
    + 'Wert VARCHAR(15))';
  c2:= 'INSERT INTO TestTbl2 (ID, Wert) VALUES (%d, "%s")';
  aCon:= CoConnection.Create;
  aCon.CursorLocation:= adUseClient;
  aCon.Open(aConString,'','',adConnectUnspecified);
  MaxRec:= 10000;
  try
    aCon.Execute(c1,vRows,adExecuteNoRecords);
    for i:= 1 to MaxRec do begin
      aCon.Execute(Format(c2,[i, 'Nr: ' + IntToStr(i)]),
        vRows,adExecuteNoRecords);
      if (i mod 100 = 0) then begin
        StaticText1.Caption:= Format('Satz %d von %d',[i,MaxRec]);
        StaticText1.Update
      end
    end;
  finally
    StaticText1.Caption:= Format('Satz %d von %d',[i,MaxRec]);
    StaticText1.Update;
    aCon.Close;
    aCon:= nil
  end;
end;

procedure TMainDlg.eintragen1Click(Sender: TObject);
var
  aCon: _Connection;
  aRecordSet1: _RecordSet;
  i, MaxRec: LongInt;
  vRS, vRows: OleVariant;
  c1: String;
begin
  c1:= 'CREATE TABLE TestTbl2 (ID INT NOT NULL PRIMARY KEY, '
    + 'Wert VARCHAR(15) NOT NULL)';
  MaxRec:= 10000;
  aCon:= CoConnection.Create;
  aCon.Open(aConString,'','',adConnectUnspecified);
  aCon.Execute(c1,vRows,adExecuteNoRecords);
  aRecordSet1:= CoRecordSet.Create;

  try
    aRecordSet1.Open('SELECT * FROM TestTbl2',aCon,adOpenStatic,
      adLockOptimistic,adCmdText);

    vRs:= OleVariant(aRecordSet1);
    for i:= 1 to MaxRec do begin
      if (i mod 100 = 0) then begin
        StaticText1.Caption:= Format('Satz Nr: %d von %d',[i,MaxRec]);
        StaticText1.Update
      end;
      vRs.AddNew;
      vRs.Fields[0].Value:= i;
      vRs.Fields[1].Value:= Format('Eintrag: %d',[i]);
      vRs.Update;
    end;

  finally
    StaticText1.Caption:= Format('Satz Nr: %d von %d',[i,MaxRec]);
    StaticText1.Update;
    aRecordSet1.Close;
    aCon.Close
  end;
end;
ganz gleich, ob ich die einträge über die connection oder einen recordset durchführe - das ergebnis bleibt immer das selbe.

vielleicht fällt jemandem etwas dazu ein, das mir weiterhilft.

mfg, stefan
ps: schöne ostern! :)

Robert_G 10. Apr 2004 22:59

Re: tabelle wird riesengross...
 
12 mio. Einträge in MS Jet? :shock:
Suche dir lieber eine Datenbank.
Mit MS Jet wirst du schon weit vor dem 12 mio.-sten Einträg eine korrupte Datei vorfinden.

grayfox 10. Apr 2004 23:16

Re: tabelle wird riesengross...
 
hallo robert!

es geht ja auch gar nicht um die 12 mio (das ist auch nur eine vorsichte schätzung ;) )
ich frag mich, wieso die nativen ADO-komponenten derart grosszügig mit dem speicherplatz umgehen...
wegen einer DB frag ich dich nicht, sonst verkaufst mir gleich ORACLE :mrgreen:

mfg, stefan

Robert_G 10. Apr 2004 23:49

Re: tabelle wird riesengroß ...
 
Ich glaube das hat nix mit den Komponenten zu tun.
Du greifst über die per MS Jet 4.0 auf das prökelige .mdb-Dateichen zu.
Access ist doch nur Oberfläche für MS Jet (sozusagen MS Jet fD, du willst nicht wissen, was fD heißt :mrgreen: ).
Wenn du dort auf komprimieren klickst, dann schmeißt er allen unnötigen Müll raus. Hättest du dort die 10k Einträge eingefügt, wäre das Ergebnis IMHO gleich.
Zitat:

wegen einer DB frag ich dich nicht, sonst verkaufst mir gleich ORACLE :mrgreen:
Nö mache ich nicht, es muss ja auch noch Masochisten in dem Geschäft geben :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 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