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
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