duzo rekordow na raz

0

Witam

jestem opczatkujacy w temacie Baz danych.
zaskoczylo mnie ze zapis danych do bazy (z mojego programu) trwa tak dlugo.

Kazdy rekord danych przesylam oddzielnym zapytaniem sql (INSERT).

czy w 'normalnych' aplikacjach tak sie to odbywa?
czy moze istnieje możliwosc wgrania do bazy calej 'paczki' rekordow?

(pisze w Delphi przy pomocy komponentow dbExpress)

0

jaka baza, jak i kiedy zatwierdzasz transakcję, konkrety, konkrety, konkrety

0

heh

mySql 5.0.2

procedure TForm1.Button7Click(Sender: TObject);
var
  i:integer;
  t:TTIme;
  plik:TFileStream;
  rek:TRecArch;
begin
  plik:=TFileStream.Create('FAT_OPPA K10.dat',fmOpenRead);
  t:=now;
  plik.Seek(0,0);
  plik.Read(rek,sizeof(rek));
  while plik.Position<plik.Size do begin
    plik.Read(rek,sizeof(rek));
    sql.ParamByName('data').asstring:=datetimetostr(rek.Data);
    sql.ParamByName('nazwa').asstring:=rek.Nazwa;
    sql.ParamByName('wartosc').asstring:=rek.Wartosc;
    sql.ParamByName('jednostka').asstring:=rek.Jednostka;
    sql.ParamByName('status').AsInteger:=rek.Status;
    sql.PrepareStatement;
    sql.ExecSQL;
  end;
  plik.Free;
  showmessage('trwalo: '+timetostr(now-t));
end;

tresc zapytania sql:

INSERT INTO archiwum (czas, nazwa, wartosc, jednostka, status)
VALUES(:data,:nazwa,:wartosc,:jednostka,:status);

zadnych innych ustawien nie zmienialem...

0
  1. PrepareStatement powinno być tylko raz na początku, bo nie zmieniasz już samego zapytania tylko podstawiasz nowe dane dla parametrów
  2. nie pamiętam jak jest w DBXach ale są tam chyba jakieś tranzakcje
  3. możesz wstawić kilka rekordów na raz - INSERT INTO ... VALUES(...), (...), (...)
  4. jak wstawiasz duużżżoo danych to możesz na czas insertów wyłączyć indeksy i przeindeksować po dodaniu danych
  5. ile rekordów i ile trwa
0

zastosowalem punkt3 i z 45s zszedlem do 0,8sekundy.

wielkie dzieki

1 użytkowników online, w tym zalogowanych: 0, gości: 1