Thema: Delphi SQL-Abfrage zu langsam

Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#5

AW: SQL-Abfrage zu langsam

  Alt 8. Sep 2015, 13:11
Wieviele Änderungen gibt es in der Datenbank?
Wie groß ist die Datenbankdatei?

Eventuell hilft es, die Datenbank ab und an mal von Access reparieren zu lassen, sie wird dann auf eine erträgliche Dateigröße "geschrumpft". Vermutlich werden auch die Indizes neu erstellt.
Mir scheint (subjektiv) der Zugriff anschließend flüssiger vorzukommen.

Schau doch mal bitte nach, ob Du bei Dir die Komponente TJetEngine installiert hast. Sie ist in der JRO-Typlib zu finden.
Code:
// Typbib: C:\Programme\Gemeinsame Dateien\System\ado\msjro.dll (1)
// LIBID: {AC3B8B4C-B6CA-11D1-9F31-00C04FC29D52}
// LCID: 0
// Hilfedatei: C:\Programme\Gemeinsame Dateien\System\ado\msjro.chm
// Hilfe-String: Microsoft Jet and Replication Objects 2.6 Library
// DepndLst:
//   (1) v2.0 stdole, (C:\WINDOWS\system32\STDOLE2.TLB)
//   (2) v2.8 ADODB, (C:\Programme\Gemeinsame Dateien\System\ado\msado15.dll)
Mit 'nem Quelltext in der Art, könntest Du das Packen auch von Deinem Programm übernehmen lassen:
Delphi-Quellcode:
procedure TfmAccessDatenbankenPacken.PackMDB(sDatenbankname : String);
var
  sConnectionString : WideString;
  sdbTemp : WideString;
  sdb : WideString;
  sConDB : WideString;
  sConDBTemp : WideString;
begin
  Screen.Cursor := crSQLWait;
  sConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=%s;'
                     + 'Mode=ReadWrite;Extended Properties="";'
                     + 'Jet OLEDB:System database="";'
                     + 'Jet OLEDB:Registry Path="";'
                     + 'Jet OLEDB:Database Password="";'
                     + 'Jet OLEDB:Engine Type=5;'
                     + 'Jet OLEDB:Database Locking Mode=1;'
                     + 'Jet OLEDB:Global Partial Bulk Ops=2;'
                     + 'Jet OLEDB:Global Bulk Transactions=1;'
                     + 'Jet OLEDB:New Database Password="";'
                     + 'Jet OLEDB:Create System Database=False;'
                     + 'Jet OLEDB:Encrypt Database=False;'
                     + 'Jet OLEDB:Don''t Copy Locale on Compact=False;'
                     + 'Jet OLEDB:Compact Without Replica Repair=False;'
                     + 'Jet OLEDB:SFP=False';
  sDB := sDatenbankname;
  sDBTemp := ChangeFileExt(sDB,'.tmp.mdb');
  sConDB := Format(sConnectionString,[sDB]);
  sConDBTemp := Format(sConnectionString,[sDBTemp]);
  Application.ProcessMessages;
  if FileExists(sdbTemp) then DeleteFile(sdbTemp);
  try
    je.CompactDatabase(sConDB,sConDBTemp);
    DeleteFile(sdb);
    RenameFile(sdbTemp, sDB);
  except
    on E : Exception do begin
      MessageDlg(E.Message,mtError,[mbOK],0);
    end;
  end;
  Screen.Cursor := crDefault;
  Application.ProcessMessages;
end;
Das ist aus 'nem Programm geklaut und muss nicht sofort so funktionieren, aber vielleicht kannst Du damit ja was anfangen.
  Mit Zitat antworten Zitat