AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi tabelle wird riesengroß ...
Thema durchsuchen
Ansicht
Themen-Optionen

tabelle wird riesengroß ...

Ein Thema von grayfox · begonnen am 10. Apr 2004 · letzter Beitrag vom 10. Apr 2004
Antwort Antwort
grayfox

Registriert seit: 22. Jan 2003
Ort: Litschau
173 Beiträge
 
Delphi 4 Standard
 
#1

tabelle wird riesengroß ...

  Alt 10. Apr 2004, 21:27
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!
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#2

Re: tabelle wird riesengross...

  Alt 10. Apr 2004, 22:59
12 mio. Einträge in MS Jet?
Suche dir lieber eine Datenbank.
Mit MS Jet wirst du schon weit vor dem 12 mio.-sten Einträg eine korrupte Datei vorfinden.
  Mit Zitat antworten Zitat
grayfox

Registriert seit: 22. Jan 2003
Ort: Litschau
173 Beiträge
 
Delphi 4 Standard
 
#3

Re: tabelle wird riesengross...

  Alt 10. Apr 2004, 23:16
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

mfg, stefan
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#4

Re: tabelle wird riesengroß ...

  Alt 10. Apr 2004, 23:49
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 ).
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
Nö mache ich nicht, es muss ja auch noch Masochisten in dem Geschäft geben
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:36 Uhr.
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