Verwenden von Rushmore zum Beschleunigen des Datenzugriffs

Um Sie bei der Optimierung der Leistung Ihrer Anwendungen zu unterstützen, enthält Visual FoxPro die Rushmore-Technologie für den Datenzugriff. Mit Rushmore können bestimmte komplexe Tabellenoperationen hundert- oder tausendmal schneller durchgeführt werden.

Zum besseren Verständnis der Rushmore-Technologie

Bei der Rushmore-Technologie handelt es sich um eine Datenzugriffstechnik, die den Datenzugriff mit Visual FoxPro-Standard-Indizes beschleunigt. Sie können Rushmore mit jedem beliebigen Visual FoxPro-Index (einschließlich FoxPro 1.x-Indizes (IDX), komprimierten Indizes (IDX) und Mehrfachindizes (CDX)) einsetzen.

Sowohl CDX- als auch komprimierte IDX-Indizes verwenden eine Kompressionstechnik, die Indizes erstellt, die nur bis zu einem Sechstel des Umfangs unkomprimierter Indizes des alten Formats haben. Visual FoxPro kann einen komprimierten Index schneller verarbeiten, da dieser weniger Plattenzugriffe benötigt und ein größerer Teil des Indexes im Arbeitsspeicher zwischengespeichert werden kann. Obwohl Rushmore, wie auch andere Techniken, für den Dateizugriff die Vorteile der geringeren Größe komprimierter Indizes nutzen kann, funktioniert es auch mit Indizes des alten Formats sehr gut.

Bearbeitet Visual FoxPro sehr große Tabellen auf Computern mit nur wenig Arbeitsspeicher, hat Rushmore möglicherweise nicht genügend Arbeitsspeicher. In diesem Fall zeigt Visual FoxPro eine Warnmeldung an ("Zu wenig Speicher für Optimierung"). Zwar arbeitet das Programm auch in diesem Fall korrekt und ohne Datenverlust, es ergeben sich dann jedoch für die Abfrage keine Vorteile aus der Rushmore-Optimierung.

In seiner einfachsten Form erhöht Rushmore die Leistung von Einzeltabellenbefehlen mit FOR-Klauseln, die Datensatzmengen anhand vorhandener Indizes spezifizieren. Weiterhin beschleunigt Rushmore die Operation bestimmter Befehle wie LOCATE und INDEX. Eine vollständige Liste optimierbarer Befehle finden Sie im nächsten Abschnitt, "Verwenden von Rushmore mit Tabellen".

Die SQL-Befehle von Visual FoxPro verwenden Rushmore als grundlegendes Tool bei der Optimierung von Mehrtabellenabfragen. Dabei werden vorhandene Indizes eingesetzt und bei Bedarf sogar neue "Ad-Hoc"-Indizes zur Beschleunigung von Abfragen erstellt.

Verwenden von Rushmore mit Tabellen

Die Verwendung von Rushmore zur Optimierung des Datenzugriffs hängt von der Anzahl betroffener Tabellen ab. Wenn Sie auf einzelne Tabellen zugreifen, können Sie Rushmore überall da nutzen, wo eine FOR-Klausel eingesetzt wird. Beim Zugriff auf mehrere Tabellen sind SELECT - SQL-Abfragen effizienter als alle Rushmore-Optimierungen. Bei SQL-Befehlen entscheidet Visual FoxPro selbst über die notwendige Optimierung und erledigt die Arbeit für Sie. Sie müssen somit keine Tabellen oder Indizes öffnen. Ist SQL der Meinung, dass es Indizes benötigt, so erstellt es für seine eigenen Zwecke temporäre Indizes.

So verwenden Sie Rushmore

Wählen Sie eine der folgenden Optionen:

  • Zum Zugriff auf Daten einer einzelnen Tabelle verwenden Sie eine FOR-Klausel in einem Befehl wie AVERAGE, BROWSE oder LOCATE; alternativ können Sie zum Aktualisieren von Tabellen auch SQL-Befehle verwenden. In der folgenden Tabelle finden Sie eine vollständige Liste der Befehle, die eine FOR-Klausel verwenden.

    - Oder -

  • Zum Zugriff auf Daten aus mehr als einer Tabelle verwenden Sie einen der Befehle SELECT - SQL, DELETE - SQL oder UPDATE - SQL.

Die folgende Tabelle führt Befehle mit einer FOR-Klausel auf. Die Geschwindigkeit von Rushmore steigt proportional mit der Anzahl der abgerufenen Datensätze.

Potenziell optimierbare Befehle mit FOR-Klauseln

AVERAGE-Befehl BLANK-Befehl
BROWSE-Befehl CALCULATE-Befehl
CHANGE-Befehl COPY TO-Befehl
COPY TO ARRAY-Befehl COUNT-Befehl
DELETE-Befehl DISPLAY-Befehl
EDIT-Befehl EXPORT TO-Befehl
INDEX-Befehl JOIN WITH-Befehl
LABEL-Befehl LIST-Befehl
LOCATE-Befehl RECALL-Befehl
REPLACE-Befehl REPLACE FROM ARRAY-Befehl
REPORT-Befehl SCAN-Befehl
SET DELETED-Befehl SET FILTER-Befehl
SORT TO-Befehl SUM-Befehl
TOTAL TO-Befehl  

Um die Vorteile von Rushmore nutzen zu können, muss eine zusätzlich zu einer optimierbaren FOR-Klausel verwendete Bereichsklausel auf ALL oder REST gesetzt werden. Die Bereichsklauseln NEXT und RECORD deaktivieren Rushmore. Rushmore funktioniert somit, wenn Sie keine Bereichsklausel verwenden, da der Standardbereich für die meisten Befehle ALL ist.

Außer gefilterten und eindeutigen Indizes kann Rushmore alle geöffneten Indizes verwenden.

Anmerkung   Für optimale Leistung stellen Sie keine Reihenfolge für die Tabelle ein.

Die Reihenfolge wird automatisch eingestellt, wenn ein Index oder ein Indexname erstellt wird. Möchten Sie mit einer großen Datenmenge, die in einer bestimmten Reihenfolge sein muss, den größtmöglichen Nutzen aus Rushmore ziehen, geben Sie den Befehl SET ORDER TO zum Deaktivieren der Indexsteuerung ein und verwenden dann den Befehl SORT.

Effektive Indizierung für Rushmore

Rushmore kann nicht aus allen Indizes Nutzen ziehen. Wird im Befehl INDEX eine FOR-Klausel verwendet, kann Rushmore den Index zur Optimierung nicht verwenden. So kann z. B. die folgende Anweisung nicht optimiert werden, da sie eine FOR-Klausel enthält:

INDEX ON ORDNUM FOR DISCOUNT > 10 TAG ORDDISC

Rushmore kann ebenfalls keinen Index verwenden, der mit einer NOT-Bedingung erstellt wurde. Der folgende Ausdruck kann z. B. optimiert werden:

INDEX ON DELETED() TAG DEL

Dieser Ausdruck hingegen kann nicht optimiert werden:

INDEX ON NOT DELETED() TAG NOTDEL
  • Wenn Sie beispielsweise gelöschte Datensätze aus einer Abfrage ausschließen möchten, würde ein Index wie im ersten Beispiel weiter oben die Operationen dann beschleunigen, wenn SET DELETED auf ON festgelegt wurde.

Betrieb ohne Rushmore

In folgenden Fällen gehen Datenabfrageoperationen ohne Rushmore-Optimierung vonstatten:

  • Wenn Rushmore in einem potenziell optimierbaren Befehl den FOR-Klauselausdruck nicht optimieren kann.
  • Wenn ein Befehl, der von Rushmore profitieren könnte, eine WHILE-Klausel enthält.
  • Wenn wenig Hauptspeicher zur Verfügung steht. Der Datenabruf wird fortgesetzt, jedoch nicht optimiert.

Deaktivieren von Rushmore

Sie können Rushmore deaktivieren, obwohl dies selten erforderlich ist. Wenn Sie einen Befehl ausführen, der Rushmore verwendet, bestimmt Visual FoxPro sofort, welche Datensätze mit dem FOR-Kriterium übereinstimmen. Diese Datensätze werden dann durch den Befehl manipuliert.

Modifiziert ein potenziell optimierbarer Befehl den Indexschlüssel der FOR-Klausel, kann das Recordset, mit der Rushmore arbeitet, überholt sein. In diesem Fall können Sie die Rushmore-Optimierung deaktivieren, um sicherzustellen, dass Sie über die aktuellsten Daten der Tabelle verfügen.

So deaktivieren Sie Rushmore für einen individuellen Befehl

  • Verwenden Sie die Klausel NOOPTIMIZE.

    Dieser Befehl LOCATE wird beispielsweise nicht optimiert:

    LOCATE FOR DueDate < {^1998-01-01} NOOPTIMIZE
    

Mit Hilfe des Befehls SET OPTIMIZE können Sie Rushmore global für alle Befehle, die von Rushmore profitieren, deaktivieren oder aktivieren.

So deaktivieren Sie Rushmore global

  • Verwenden Sie folgenden Code:

    SET OPTIMIZE OFF
    

So aktivieren Sie Rushmore global

  • Verwenden Sie folgenden Code:

    SET OPTIMIZE ON
    

Die Standardeinstellung für die Rushmore-Optimierung ist ON.

Optimieren von Rushmore-Ausdrücken

Die Rushmore-Technologie basiert auf der Anwesenheit eines einfachen optimierbaren Ausdrucks in einer FOR- oder einer SQL WHERE-Klausel. Ein einfacher optimierbarer Ausdruck kann einen kompletten Ausdruck bilden oder Teil eines solchen sein. Sie können auch einfache optimierbare Ausdrücke zu komplexen optimierbaren Ausdrücken kombinieren.

Erstellen einfacher optimierbarer Ausdrücke

Ein einfacher optimierbarer Ausdruck hat eine der beiden folgenden Formen:

eIndex relOp eExp

- Oder -

eExpr relOp eIndex

Ein einfacher optimierbarer Ausdruck wird folgendermaßen charakterisiert:

  • eIndex entspricht exakt dem Ausdruck, mit dem der Index erstellt wurde.
  • eExpr ist ein beliebiger Ausdruck, der Variablen und Felder anderer, unbeteiligter Tabellen enthalten kann.
  • relOp ist einer der folgenden relationalen Operatoren: <, >, =, <=, >=, <>, #, == oder !=. Außerdem können Sie die Funktionen ISNULL( ), BETWEEN( ) und INLIST( ) (bzw. deren SQL-Äquivalente wie IS NULL usw.) verwenden.

BETWEEN( ) und INLIST( ) können Sie in den beiden folgenden Formaten verwenden:

eIndex BETWEEN(eIndex, eExpr, eExpr)

- Oder -

eExpr INLIST(eIndex, eExpr)

Anmerkung   ISBLANK( ) und EMPTY( ) können von Rushmore nicht optimiert werden.

Beispielsweise ist jeder der folgenden Ausdrücke optimierbar, wenn Sie die Indizes firstname, custno, UPPER(lastname) und hiredate erstellt haben:

firstname = "Fred"
custno >= 1000
UPPER(lastname) = "SMITH"
hiredate < {^1997-12-30}

Ein optimierbarer Ausdruck kann Variablen und Funktionen enthalten, die zu einem bestimmten Wert ausgewertet werden. Wenn Sie z. B. bei Verwendung des Indexes addr den Befehl STORE "WASHINGTON AVENUE" TO cVar absetzen, handelt es sich bei den folgenden Ausdrücken um einfache optimierbare Ausdrücke:

ADDR = cVar
ADDR = SUBSTR(cVar,8,3)

Optimierung von Abfragen

Es ist wichtig zu erkennen, wann Abfragen optimiert werden sollten. Visual FoxPro optimiert Suchbedingungen, indem es nach einer exakten Übereinstimmung zwischen der linken Seite eines Filterausdrucks und einem Indexausdruck sucht. Rushmore kann daher einen Ausdruck nur dann optimieren, wenn Sie exakt nach dem in einem Index verwendeten Ausdruck suchen.

Angenommen Sie haben gerade eine Tabelle erstellt und fügen dieser mit dem folgenden Befehl den ersten Index hinzu:

USE CUSTOMERS
INDEX ON UPPER(cu_name) TAG name

Der folgende Befehl ist nicht optimierbar, da die Suchbedingung nur auf dem Feld cu_name und nicht auf einem im Index verwendeten Ausdruck basiert.

SELECT * FROM customers WHERE cu_name ="ACME"

Sie sollten stattdessen wie im folgenden Befehl einen optimierbaren Ausdruck verwenden, in dem der gesuchte Ausdruck exakt einem Indexausdruck entspricht:

SELECT * FROM customers WHERE UPPER(cu_name) = "ACME"

Tipp   Durch einen Aufruf von SYS(3054) können Sie den Optimierungsgrad von Rushmore feststellen.

Kombinieren einfacher optimierbarer Ausdrücke

Sie können auf einer FOR- oder WHERE-Klausel basierende einfache oder komplexe Ausdrücke kombinieren, wenn die FOR-Ausdrücke die Charakteristik einfacher optimierbarer Ausdrücke aufweisen.

Einfache Ausdrücke können optimierbar sein. Sie können mit Hilfe der logischen Operatoren AND, OR und NOT einfache Ausdrücke zu komplexen FOR-Klausel-Ausdrücken kombinieren, die wiederum optimierbar sein können. Ein aus einfachen optimierbaren Ausdrücken gebildeter Ausdruck ist selbst vollständig optimierbar. Sind ein oder mehrere der einfachen Ausdrücke nicht optimierbar, kann der kombinierte komplexe Ausdruck teilweise oder auch gar nicht optimierbar sein.

Es gibt eine Regelmenge dafür, ob ein aus einfachen optimierbaren oder nicht optimierbaren Ausdrücken gebildeter Ausdruck vollständig, teilweise oder nicht optimierbar ist. Die folgende Tabelle fasst die Rushmore-Optimierungsregeln für Abfragen zusammen.

Kombinieren einfacher Ausdrücke

Einfacher Ausdruck Operator Einfacher Ausdruck Abfrageergebnis
Optimierbar AND Optimierbar Vollständig optimierbar
Optimierbar OR Optimierbar Vollständig optimierbar
Optimierbar AND Nicht optimierbar Teilweise optimierbar
Optimierbar OR Nicht optimierbar Nicht optimierbar
Nicht optimierbar AND Nicht optimierbar Nicht optimierbar
Nicht optimierbar OR Nicht optimierbar Nicht optimierbar
NOT Optimierbar Vollständig optimierbar
NOT Nicht optimierbar Nicht optimierbar

Mit Hilfe des AND-Operators können Sie zwei optimierbare Ausdrücke zu einem vollständig optimierbaren Ausdruck kombinieren.

FIRSTNAME = "FRED" AND HIREDATE < {^1997-12-30}      && Optimizable

In diesem Beispiel kombiniert der OR-Operator einen einfachen optimierbaren Ausdruck mit einem nicht optimierbaren Ausdruck zu einem nicht optimierbaren Ausdruck.

FIRSTNAME = "FRED" OR "S" $ LASTNAME      && Not optimizable

Die Anwendung des NOT-Operators auf einen optimierbaren Ausdruck führt zu einem vollständig optimierbaren Ausdruck.

NOT FIRSTNAME = "FRED"      && Fully optimizable

Sie können auch Kombinationen einfacher Ausdrücke mit Klammern gruppieren.

Kombinieren komplexer Ausdrücke

Wie bei der Kombination einfacher Ausdrücke können Sie auch komplexe Ausdrücke zu noch komplexeren, vollständig, teilweise oder nicht optimierbaren Ausdrücken kombinieren. Sie können dann diese komplexeren Ausdrücke wiederum zu vollständig, teilweise oder nicht optimierbaren Ausdrücken kombinieren. Die folgende Tabelle beschreibt das Ergebnis der Kombination komplexer Ausdrücke. Diese Regeln gelten auch für mittels Klammern gruppierte Ausdrücke.

Kombinieren komplexer Ausdrücke

Ausdruck Operator Ausdruck Ergebnis
Vollständig optimierbar AND Vollständig optimierbar Vollständig optimierbar
Vollständig optimierbar OR Vollständig optimierbar Vollständig optimierbar
Vollständig optimierbar AND Teilweise optimierbar Teilweise optimierbar
Vollständig optimierbar OR Teilweise optimierbar Teilweise optimierbar
Vollständig optimierbar AND Nicht optimierbar Teilweise optimierbar
Vollständig optimierbar OR Nicht optimierbar Nicht optimierbar
NOT Vollständig optimierbar Vollständig optimierbar
Teilweise optimierbar AND Teilweise optimierbar Teilweise optimierbar
Teilweise optimierbar OR Teilweise optimierbar Teilweise optimierbar
Teilweise optimierbar AND Nicht optimierbar Teilweise optimierbar
Teilweise optimierbar OR Nicht optimierbar Nicht optimierbar
NOT Teilweise optimierbar Nicht optimierbar
Nicht optimierbar AND Nicht optimierbar Nicht optimierbar
Nicht optimierbar OR Nicht optimierbar Nicht optimierbar
NOT Nicht optimierbar Nicht optimierbar

Mit Hilfe des OR-Operators können Sie vollständige optimierbare Ausdrücke zu einem ebenfalls vollständig optimierbaren Ausdruck kombinieren.

* Fully-optimizable expression
(FIRSTNAME = "FRED" AND HIREDATE < {^1997-12-30}) ;
   OR (LASTNAME = "" AND HIREDATE > {^1996-12-30})

Wenn Sie einen vollständig optimierbaren Ausdruck mit einem nicht optimierbaren Ausdruck kombinieren, erhalten Sie einen teilweise optimierbaren Ausdruck. Im folgenden Beispiel werden die Ausdrücke mit Hilfe des AND-Operators kombiniert:

* Partially-optimizable expression
(FIRSTNAME = "FRED" AND HIREDATE < {^1997-12-30}) ;
   AND "S" $ LASTNAME

Teilweise optimierbare Ausdrücke können zu ebenfalls teilweise optimierbaren Ausdrücken kombiniert werden:

* Partially-optimizable expression
(FIRSTNAME = "FRED" AND "S" $ LASTNAME) ;
   OR (FIRSTNAME = "DAVE" AND "T" $ LASTNAME)

Die Kombination nicht optimierbarer Ausdrücke liefert einen nicht optimierbaren Ausdruck.

* Expression that is not optimizable
("FRED" $ FIRSTNAME OR "S" $ LASTNAME) ;   
   OR ("MAIN" $ STREET OR "AVE" $ STREET)

Siehe auch

Optimierung von Tabellen und Indizes | Optimieren von Formularen und Steuerelementen | Optimieren von Anwendungen | Optimieren des Systems | LOCATE-Befehl | INDEX-Befehl