Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Prism SQL bei Acess langsam (https://www.delphipraxis.net/57699-sql-bei-acess-langsam.html)

eddie11 25. Nov 2005 11:15

Datenbank: Access • Zugriff über: ADO

SQL bei Acess langsam
 
Hi,

bin SQL-Newbie und habe ein Problem. Ich habe eine Tabelle in einer Access-Datenbank mit etwa 100.000 Sätzen, Ich möchte ab einer bestimmten Position (Kundennummer ist Primary-Key) jeweils 10 Datensätze einlesen.

Delphi-Quellcode:
var
    Connstr: System.String;
    Sql: System.String;
    Conn: OleDbConnection;
    DAdapter: OleDbDataAdapter;
    DSet: DataSet;
    DTable: DataTable;
    DRow: DataRow;

begin
   Connstr:= 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=..\AccessDatenbank.mdb';
   Conn := oledbconnection.create(connstr);
   Sql := 'SELECT TOP 20 * FROM Debitor ORDER BY Kundennummer';
   DAdapter := OleDbDataAdapter.Create(Sql, Conn);
   DSet:= DataSet.Create();
   DAdapter.fill(DSet,0,10,'Debitor');
   conn.open;
   DTable := DSet.Tables['Debitor'];
   DRow := DTable.Rows[0];
   kundennummer := DRow['Kundennummer'].ToString;
   conn.close;
end;

Es dauert ewig und drei Tage bis der SQL-Befehl abgearbeitet ist und die ersten 10 Sätze zur Bearbeitung zur Verfügung stehen. Meine Frage: mach ich irgendwas falsch oder ist Access für solche grossen Datenmengen einfach nur ungeeignet?

Danke und Gruß
Eddie

Bernhard Geyer 25. Nov 2005 11:19

Re: SQL bei Acess langsam
 
Ich weiß jetzt nicht wo du es bei .NET und OLEDB einstellst, aber unter Win32 sollte man bei Access immer die Curser-Location auf clUseServer stellen, damit nicht die Ergebnismenge nochmals im Speicher kopiert wird sondern direkt die Ergebnismenge direkt von der JET-Engine verwendet wird.

alzaimar 25. Nov 2005 12:44

Re: SQL bei Acess langsam
 
Um die ersten 20 Records, sortiert nach Kundennummer darzustellen, muss Access ja wissen, welches die 20 Records sind. Wenn Du keinen Index auf der Kundennummer hast, dann verwurstet dir jede DB die gesamte Tabelle, bzw. sortiert diese. Die SQL-Engine von Access ist sowieso nicht die Schnellste, aber so ein einfaches SELECT sollte es doch hinbekommen.

Wo der Cursor ist (Client oder Server) ist hier imho egal, weil es sowieso nur 20 Records sind. Ansonsten hast Du aber recht.

eddie11 25. Nov 2005 12:54

Re: SQL bei Acess langsam
 
Das weiss ich schon, dass die Datenbank wissen muss welches die ersten 20 Records sind, habe die Kundennummer als Primary-Key definiert - reicht das nicht? Muss ich noch irgendwas definieren?

Eddie

Bernhard Geyer 25. Nov 2005 12:56

Re: SQL bei Acess langsam
 
Zitat:

Zitat von alzaimar
Wo der Cursor ist (Client oder Server) ist hier imho egal, weil es sowieso nur 20 Records sind. Ansonsten hast Du aber recht.

Hab ich überlesen das es ein "TOP 20"-Abfrage ist.

Was passiert wenn das gleiche direkt Access durchgeführt wird?

alzaimar 25. Nov 2005 13:00

Re: SQL bei Acess langsam
 
OK. Ich weiss nicht genau, ob ein PK auch einen Index erzeugt, probier doch mal, ob es noch langsamer ist, wenn Du z.B. ein "ORDER BY Anschrift" machst...

Wenn Du das Select in Access aufrufst, was passiert dann? [2 Geeks, ein Gedanke, Bernhard, ;-)]
Wenn Du das Select ohne ORDER BY ausführst, was passiert?

eddie11 25. Nov 2005 13:20

Re: SQL bei Acess langsam
 
Wenn ich ohne ORDER BY mach, dann ist es Rattenschnell, aber natürlich nict in der gewünschten Sortierung.

SQL-Code:
select TOP 20 * FROM Debitor ORDER BY Kundennummer
Wenn ich das im SQL-Fenster vom Delphi-Datenexplorer mache, dann dauert es ca. 20 Sekunden, genauso wie im Prog

SQL-Code:
select TOP 20 * FROM Debitor ORDER BY Name1
Das braucht im Daten-Explorer auch 20 Sekunden.

Es scheint keinen Unterschied zu machen, ob ich über ein Schlüsselfeld sortiere oder nicht. Das genau sollte aber doch der Sinn eines Schlüsselfeldes sein...

Eddie

alzaimar 25. Nov 2005 15:47

Re: SQL bei Acess langsam
 
Zitat:

Zitat von eddie11
Es scheint keinen Unterschied zu machen, ob ich über ein Schlüsselfeld sortiere oder nicht. Das genau sollte aber doch der Sinn eines Schlüsselfeldes sein...
Eddie

Ein PK dient dazu, die einzelnen Datensätze eindeutig zu identifizieren. Und ein Index dient in erster Linie dazu, etwas schnell zu finden, und nicht, die Daten sortiert abzulegen. Der PK sollte, da hast Du Recht, vom Sinn her allerdings dafür sorgen, das die Daten schon sortiert abgelegt werden. Das tut es aber nicht. Wenn ich z.B. im SQL-Server nur ein PK definiere, bekomme ich einen 'non-clustered' Index. Aber nur ein 'clustered' Index sortiert mir die Datensätze. Leider kennt Access keine 'clustered' Indexe.

Du merkst, das Access bei so vielen Daten nicht das gelbe vom Ei ist. Ich würde sowieso auf eine richtige DB umsteigen, z.B. MSDE, FB o.ä. Ich arbeite mit MSDE / MS SQL-Server und bin sehr zufrieden. Ich habe keine Performanceprobleme.

eddie11 25. Nov 2005 16:51

Re: SQL bei Acess langsam
 
wollte ohnehin nicht mit Access arbeiten, habe nur der Einfachheit halber zu Versuchszwecken - bin absoluter Delphi-Newbie - mit Access rumprobiert, um nicht extra einen DB-Server aufsetzen zu müssen. Werde jetzt wohl doch einen MySql o.ä. einrichten.

Danke für die schnelle Hilfe
Eddie

alzaimar 25. Nov 2005 17:25

Re: SQL bei Acess langsam
 
Nee, nich mySQL. Schnapp Dir lieber die MSDE oder FB. Das ist die DB auch dann noch 100% ok, wenn der PC mal abschmiert (z.B. beim Stromausfall). Bei mySQL ist dann u.U. die komplette DB nicht mehr lesbar. Nie wieder.


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