Freigeben über


Beschleunigen des Abrufens von Daten

Sie können den Datenabruf beschleunigen, indem Sie die Anzahl der Datensätze bestimmen, die beim kontinuierlichen Abrufen gelesen werden, den Umfang der abgerufenen Daten festlegen und das verzögerte Abrufen von Memofeldern verwenden.

Sie können auch die UseMemoSize-Ansichtseigenschaft verwenden, um Zeichenfelder als Memofelder zurückzugeben, und dann FetchMemo so einstellen, dass Ihre Anwendung die in Memofelder konvertierten Zeichenfelder einzeln abrufen kann.

Einsetzen des kontinuierlichen Lesens

Wenn Sie eine Remotedatenquelle abfragen, ruft Visual FoxPro vollständige Datensätze ab und erstellt einen Visual FoxPro-Cursor. Um das Abrufen von Remotedaten zu beschleunigen, setzt Visual FoxPro das kontinuierliche Abrufen für Ansichtscursor oder Cursor, die asynchron über SQL Pass-Through erstellt werden, ein. Sie oder Ihre Anwendung müssen nicht warten, bis ein Dataset komplett abgerufen ist, sondern Visual FoxPro führt eine Abfrage aus und liest nur einen Teil des gesamten Resultsets in den lokalen Cursor. Eine solche Teilmenge umfasst standardmäßig 100 Datensätze (Zeilen).

Anmerkung   Synchrone SQL Pass-Through-Anweisungen arbeiten nicht mit kontinuierlichem Lesen. Ihre Anwendung erhält die Kontrolle erst zurück, nachdem das gesamte Resultset abgerufen ist, die eine mit SQLEXEC( ) gesendete SQL-Anweisung angefordert hat.

Visual FoxPro ruft nach und nach weitere Datensätze ab, so dass der jeweilige lokale Cursor stufenweise eine größere Teilmenge der abzurufenden Daten enthält. Da nicht alle Datensätze auf einmal bei der Datenquelle abgerufen werden, sind die Inhalte der Datensätze nicht automatisch aktuell. Arbeitet Ihre Verbindung im Asynchronmodus, gibt Visual FoxPro die Kontrolle an Sie bzw. Ihr Programm zurück, sobald es die erste Teilmenge der Daten gelesen hat. Danach liest Visual FoxPro die verbliebenen Datensätze der Ergebnismenge als Teilmenge im Hintergrund in den lokalen Cursor. Diese Vorgehensweise ermöglicht es Ihnen, mit den bereits in den Cursor gelesenen Daten zu arbeiten, ohne auf die weiteren Daten warten zu müssen.

Anmerkung   Durch das Erhöhen der Anzahl der Datensätze, die abgerufen werden, wird zwar die Leistung optimiert, das Antwortverhalten der Benutzeroberfläche verschlechtert sich jedoch. Das Verringern der Anzahl der abzurufenden Datensätze bewirkt das Gegenteil.

Abrufen von Daten bei Bedarf

Sie haben die Möglichkeit, das kontinuierliche Lesen zu deaktivieren und stattdessen Datensätze je nach Bedarf abzurufen, indem Sie die FetchAsNeeded-Eigenschaft für Datenbanken oder Cursor von Ansichten einstellen. Dies kann bewirken, dass der Datenabruf für Remoteansichten oder Ansichten, die sehr große Resultsets abrufen, effizienter wird.

Die FetchAsNeeded-Eigenschaft ist standardmäßig auf Falsch (.F.) eingestellt, was bedeutet, dass standardmäßig das kontinuierliche Lesen verwendet wird. Wenn Sie die FetchAsNeeded-Eigenschaft auf Wahr (.T.) einstellen, werden Datensätze nur abgerufen, wenn sie tatsächlich benötigt werden. Wenn die FetchAsNeeded-Eigenschaft auf Wahr (.T.) eingestellt ist, können Sie erst dann eine Aktualisierung durchführen, wenn Sie entweder den Datenabruf beendet, die SQLCANCEL( )-Funktion für die aktuelle Verbindungskennung aufgerufen oder die Ansicht geschlossen haben.

Um sich die Auswirkungen der FetchAsNeeded-Eigenschaft zu verdeutlichen, stellen Sie sie für eine Ansicht, die ein großes Resultset abruft, auf Wahr (.T.) ein. Öffnen Sie anschließend ein Datenblattfenster für die Ansicht, und führen Sie einen Bildlauf durch. Während des Bildlaufs durch das Datenblattfenster wird in der Statusleiste stets die aktuelle Anzahl der abgerufenen Datensätze angezeigt.

Festlegen, wie Cursor gelesen werden

Wenn Sie den gesamten Cursor lesen möchten, können Sie den GOTO BOTTOM-Befehl oder einen anderen Befehl angeben, der Zugriff auf das gesamte Dataset erfordert.

Tipp   Zwar können Sie mit dem GOTO BOTTOM-Befehl einen gesamten Cursor lesen, meist ist es aber effizienter, eine parametrisierte Ansicht zu erstellen, die nur jeweils einen Datensatz liest und erneut abfragt, sobald der Benutzer den Datensatz gewechselt hat. Weitere Informationen zum Erstellen leistungsfähiger Ansichten finden Sie unter Erstellen von Ansichten.

Programme stellen keine Schleifenverarbeitung im Leerlauf zur Verfügung. Soll der Cursor einer Ansicht programmgesteuert gelesen werden, müssen Sie einen der Befehle GO nRecordNumber oder GOTO BOTTOM ausgeben. Wenn Sie einen Cursor lesen möchten, der über SQL Pass-Through im Asynchronmodus erstellt wurde, müssen Sie die asynchrone SQL Pass-Through-Funktion jeweils für jede Teilmenge der Datensätze aufrufen.

Abbrechen einer mit SQLEXEC( ) gesendeten Anweisung

Sie können eine mit SQLEXEC( ) gesendete SQL-Anweisung oder eine Ansicht jederzeit mit einer SQLCANCEL( )-Funktion abbrechen. Für den Fall, dass der Server das Remoteresultset vollständig erstellt und Visual FoxPro damit begonnen hat, das Remoteresultset in den lokalen Cursor zu lesen, bricht SQLCANCEL( ) zwar die mit SQLEXEC( ) gesendete SQL-Anweisung ab, löscht aber nicht den lokalen Cursor. Wenn Sie den lokalen Cursor löschen möchten, geben Sie den USE-Befehl ein, der den Cursor schließt und den Datenabruf abbricht.

Ein USE-Befehl bricht eine mit SQLEXEC( ) gesendete SQL-Anweisung dann nicht ab, wenn die Anweisung noch keinen lokalen Cursor erstellt hat. Mit einer USED( )-Funktion können Sie ermitteln, ob Visual FoxPro einen lokalen Cursor erstellt hat.

Festlegen des Leseumfangs

Mit der FetchSize-Eigenschaft einer Ansicht legen Sie fest, wie viele Datensätze Ihre Anwendung pro Lesevorgang von einem Remoteserver in einen lokalen Cursor liest. Die FetchSize-Eigenschaft gibt an, wie viele Datensätze pro Lesevorgang mittels kontinuierlichem Lesen oder Aufrufen asynchroner SQL Pass-Through-Funktionen vom Remoteserver in den lokalen Cursor gelesen werden. Der Standardwert ist 100 Datensätze.

So legen Sie fest, wie viele Datensätze pro Lesevorgang in eine Ansicht gelesen werden

  • Klicken Sie im Ansichts-Designer im Menü Abfrage auf Erweiterte Optionen. Legen Sie im Bereich Datenabruf des Dialogfeldes Weitere Optionen mit Hilfe des Drehfeldes einen Wert für Anzahl der auf einmal abzurufenden Datensätze fest.

    - Oder -

  • Definieren Sie den Leseumfang der Ansicht, indem Sie deren FetchSize-Eigenschaft mit der DBSETPROP( )-Funktion einstellen.

    - Oder -

  • Legen Sie den Leseumfang des Cursors der aktuellen Ansicht fest, indem Sie dessen FetchSize-Eigenschaft mit CURSORSETPROP( ) einstellen.

    Die folgende Funktion stellt z. B. die Ansicht Customer_remote_view so ein, dass sie kontinuierlich jeweils 50 Datensätze pro Lesevorgang liest:

    ? DBSETPROP('Customer_remote_view', 'View', 'FetchSize', 50)
    

Verzögertes Lesen von Memofeldern

Eine gut gestaltete Anwendung arbeitet häufig mit verzögertem Lesen von Memofeldern, um das Herunterladen solcher Resultsets zu beschleunigen, die Memo- oder Objektfelder enthalten. Beim verzögerten Lesen von Memofeldern wird der Inhalt von Memo- bzw. Objektfeldern nicht automatisch zusammen mit einem Resultset heruntergeladen. Stattdessen werden zunächst die anderen Felder des Datensatzes heruntergeladen, und der Inhalt eines Memo- bzw. Objektfeldes wird erst dann abgerufen, wenn Sie dies durch das Öffnen des Memo- oder Objektfeldes veranlassen. Verzögertes Lesen von Memofeldern ermöglicht das schnellste Herunterladen von Datensätzen, denn selbst wenn die Inhalte von Memo- oder Objektfeldern umfangreich sind, werden diese nur gelesen, wenn der Benutzer sie tatsächlich benötigt.

Beispielsweise könnte Ihr Formular ein Objektfeld enthalten, das ein Bild anzeigt. Um die Leistung zu verbessern, können Sie das verzögerte Abrufen von Memofeldern verwenden. Auf diese Weise können Sie sicherstellen, dass das Bild erst dann gedownloadet wird, wenn der Benutzer im Formular auf eine Vorschauschaltfläche klickt. Die Codezeilen, die sich hinter dieser Schaltfläche verbergen, rufen dann den Inhalt des Objektfeldes ab und zeigen ihn auf dem Formular an.

Sie können das verzögerte Lesen von Memofeldern mit Hilfe der FetchMemo-Eigenschaft Ihrer Ansicht oder Ihres Cursors steuern. Die FetchMemo-Eigenschaft gibt an, ob die Inhalte der Memo- bzw. Objektfelder gelesen werden, wenn ein Datensatz heruntergeladen wird. Der Standardwert ist Wahr (.T.), d. h., dass Memo- und Objektfelder automatisch heruntergeladen werden. Umfassen die jeweiligen Daten große Mengen an Memo- oder Objektdaten, erhalten Sie wahrscheinlich ein deutlich besseres Leistungsverhalten, nachdem Sie die FetchMemo-Eigenschaft auf Falsch (.F.) eingestellt haben.

Anmerkung   Die Ansicht muss aktualisierbar sein, damit Sie das verzögerte Lesen von Memofeldern verwenden können. Dies liegt daran, dass Visual FoxPro beim Abrufen eines Memo- oder Objektfeldes die von den Aktualisierungseigenschaften erstellten Schlüsselfeldwerte dazu verwendet, auf dem Server nach dem Quelldatensatz zu suchen. Informationen darüber, wie eine Ansicht als aktualisierbare Ansicht definiert wird, finden Sie unter Erstellen von Ansichten.

Mit DBSETPROP( ) stellen Sie die FetchMemo-Eigenschaft für eine Ansicht und mit CURSORSETPROP( ) für einen Cursor ein.

Optimieren des Abrufens von Daten

Sie können die folgenden Empfehlungen für das Einstellen von Verbindungs- und Ansichtseigenschaften verwenden, um den Datenabruf zu optimieren. Dabei hat die PacketSize-Verbindungseigenschaft den größten Einfluss auf das Leistungsverhalten. Sie können den Datenabruf außerdem durch die Verwendung von synchronen Verbindungen optimieren.

Objekt Eigenschaft Einstellung
Verbindung PacketSize 4 KB bis 12 KB1
Verbindung Asynchronous2 .F.
Umgebung FetchSize3 Maximum

1. Legen Sie für umfangreichere Datensätze einen höheren Wert fest; durch Experimentieren finden Sie den besten Wert heraus.
2. Verwenden Sie synchrone Verbindungen, um die Leistung um bis zu 50% zu verbessern, es sei denn, Sie möchten in der Lage sein, SQL-Anweisungen während der Ausführung auf dem Server abzubrechen.
3. Der Einfluss von FetchSize ist sehr stark von der Datensatzgröße des abgerufenen Resultsets abhängig. Im Asynchronmodus wird die Leistung durch die FetchSize-Eigenschaft nicht wesentlich verbessert. Stellen Sie sie gegebenenfalls für das kontinuierliche Lesen asynchroner SQL Pass-Through-Verarbeitungsansichten ein. Wenn Sie für FetchSize einen niedrigeren Wert angeben, verbessert sich das Antwortverhalten während des kontinuierlichen Lesens erheblich, das Abrufen von Daten wird jedoch langsamer. Geben Sie einen höheren Wert ein, wird die Leistung beim Abrufen von Ansichten verbessert.

Das tatsächliche Leistungsverhalten hängt stark von der Konfiguration Ihres Systems sowie von den Anforderungen Ihrer Anwendung ab. Diese Empfehlungen gelten für einen Clientcomputer, der unter Windows NT, Version 3.5, mit ODBC, Version 2.10 und einem SQL Server-ODBC-Treiber, Version 2.05, läuft sowie für einen Server, der unter Windows NT, Version 3.5, mit SQL Server, Version 4.21 bzw. Version 6.0, läuft.

Siehe auch

Optimierung der Verbindungsnutzung | Beschleunigung von Abfragen und Ansichten | Client/Server-Leistungsoptimierung | Beschleunigung von Formularen | Leistungsverbesserung bei Aktualisierungs- und Löschvorgängen | Implementieren einer Client/Server-Anwendung