AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TADODataset durchscrollen wird immer langsamer
Thema durchsuchen
Ansicht
Themen-Optionen

TADODataset durchscrollen wird immer langsamer

Ein Thema von alzaimar · begonnen am 12. Okt 2006 · letzter Beitrag vom 12. Okt 2006
Antwort Antwort
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#1

TADODataset durchscrollen wird immer langsamer

  Alt 12. Okt 2006, 12:11
Datenbank: Egal (ist aber MSSQL) • Zugriff über: ADO
Ich habe hier eine Tabelle mit 50.000 Datensätzen. Die wollte ich mal einlesen und durchscrollen (mit MyDataset.Next)...

Das wird ja immer langsamer, je weiter hinten man sich in der Tabelle befindet!

Für die ersten 1000 Zeilen werden in 16 ms durchgescrollt, die Zeilen 40000-41000 dagegen in 1218ms! Die Zunahme ist übrigens linear, pro 1000 Zeilen wird das Ganze um ca. 30ms langsamer.

Kann das jemand nachvollziehen? (Vermutlich) und kennt jemand einen Trick, wie man das umgehen kann?

Hier der Code (vielleicht werde ich ja einfach alt):
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
Var
  t: Cardinal;
  n : Integer;

Begin
  ADODataset1.Open;
  t := GetTickCount;
  n := 0;
  While Not ADODataset1.eof Do Begin
    inc(n);
    If n Mod 1000 = 0 Then Begin
      memo1.lines.add(format('%d %d', [n, GetTickCount - t]));
      t := GetTickCount;
    End;
    ADODataset1.Next;
  End;
End;
Da das Memo nur 44 mal angefasst wird, hab ich mir ein BeginUpdate/EndUpdate übrigens gespart. Bringt hier sowieso nix.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: TADODataset durchscrollen wird immer langsamer

  Alt 12. Okt 2006, 14:33
Wie schaut der Speicherverbrauch der Anwendung aus? Wieviel Speicher ist überhaupt vorhanden?
Welcher Curserlocation wird verwendet?
Wiviele Ergebnisspalten sind vorhanden (Größ, Anzahl Blobs, ...)?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: TADODataset durchscrollen wird immer langsamer

  Alt 12. Okt 2006, 14:40
10 Spalten, nur int und 2x datetime, Speicherverbrauch ist 15MB
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: TADODataset durchscrollen wird immer langsamer

  Alt 12. Okt 2006, 14:51
Entscheidend ist die CursoLocation.
clUseServer: öffnen der Abfrage schnell, scrollen in der Datenmenge langsam
clUseClient: Öffnen der Abfrage dauert lange, da ALLE Datensätze vom Server zum Client transportiert werden, scrollen in der Datenmenge schnell
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: TADODataset durchscrollen wird immer langsamer

  Alt 12. Okt 2006, 15:08
Zitat von shmia:
Entscheidend ist die CursoLocation.
clUseServer: öffnen der Abfrage schnell, scrollen in der Datenmenge langsam
clUseClient: Öffnen der Abfrage dauert lange, da ALLE Datensätze vom Server zum Client transportiert werden, scrollen in der Datenmenge schnell
Das sollte sich aber nicht so graß auswirken (soweit ich das kenne) und nicht bei so popeligen 50.000 Datensätzen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: TADODataset durchscrollen wird immer langsamer

  Alt 12. Okt 2006, 15:16
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: TADODataset durchscrollen wird immer langsamer

  Alt 12. Okt 2006, 15:38
Zitat von alzaimar:
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 würde eher auf der Seite des Borland-Wrappers suchen. Ich verwende die nativen ADO-Interfaces auch bei großen MS SQL-Datenbanken und hatte bisher solch ein verhalten nicht.

Könntest Du ein kleines Testapp zusammenbasteln welche man auf die Northwind-Test-DB im MS SQL-server loslassen könnte um es an anderen Rechner testen zu können?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: TADODataset durchscrollen wird immer langsamer

  Alt 12. Okt 2006, 15:43
Hi Bernhard!

Hattest Recht, es war/ist Borland, siehe oben!
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  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 03:44 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