Gute Idee mit dem Cursor, das merke ich mir mal für später: Allerdings steht der cursor auf clUseClient.
Ich vermute mal, das die Implementierung des _Recordsets (MS) an der Stell suboptimal ist, und z.B. bei einem .Next immer von vorne anfängt zu suchen.
Ich erwähnte, das die ZUNAHME linear ist, das deutet aber auf ein quadratisches (polynomiales) Laufzeitverhalten hin. Ergo dürfte eine hirnkranke Implementierung wie oben wirklich der Grund sein.
Alles andere würde eine konstant langsame Ausführung bedeuten (Speicher, Cursorlocation etc.), weil eben pro Datensatz eine gewisse Verzögerung auftritt. Hier habe ich jedoch die Befürchtung, das daran liegt.
[EDIT]
Hab die Lösung:
Dataset.DisableControls;
Man lernt nie aus.
Hier der Code zum Beweis, das wirklich keine Datasource oder etwas anderes daran beteiligt war:
Delphi-Quellcode:
Var
t: Cardinal;
n: Integer;
d: TAdoDataset;
Begin
d := TAdoDataset.create(
Nil);
d.ConnectionString :=
'
FILE NAME=C:\Programme\Gemeinsame Dateien\System\Ole DB\Data Links\PVIP.UDL';
d.CommandText := '
select * from Production';
d.DisableControls;
// So benötigt es 0.8sec, sonst 38sec !!!!
t := GetTickCount;
d.Open;
n := 0;
While Not d.eof
Do Begin
inc(n);
If n
Mod 1000 = 0
Then
memo1.lines.add(format('
%d %d', [n, GetTickCount - t]));
d.Next;
End;
d.EnableControls;
End;
Ist das nicht bescheuert? Das DisableControls etwas bewirkt, obwohl überhaupt keine Controls da sind?
So, Microsoft ist unschuldig und Borland hat den bösen Buben.