Optimierung von Tabellen und Indizes
Mittels Indizes und durch effiziente Zwischenspeicherung können Sie den Zugriff auf Daten in Tabellen beschleunigen sowie mit Hilfe der Rushmore-Technologie Abfragen optimieren.
Verwenden von Indizes
Zum Beschleunigen des Zugriffs auf Daten in einer Tabelle verwenden Sie Indizes. Wird einer Tabelle ein Index hinzugefügt, werden Suchvorgänge insbesondere dann beschleunigt, wenn Sie die Suche mittels Rushmore-Technologie optimieren können. Durch Indizieren können die Daten auch in einer bestimmten Reihenfolge bearbeitet werden wie z. B. eine Kundentabelle nach Nachnamen sortiert anzeigen.
Haben die Datensätze einer Tabelle eindeutige Schlüssel, so erstellen Sie für dieses Feld einen Primärindex oder einen potenziellen Index. Mit diesen Indextypen kann Visual FoxPro eine Low-Level-Überprüfung des Schlüssels vornehmen, wodurch optimale Leistung erreicht wird.
Außer den für Such- und Sortiervorgänge verwendeten Feldern sollten Sie auch die Felder indizieren, die für eine Verknüpfung verwendet werden. Werden zwei Tabellen mittels nicht indizierter Felder verknüpft, kann der Verknüpfungsvorgang mehr als hundertmal solange dauern.
Eine bedeutende Funktion von Visual FoxPro ist, dass Sie Indizes auf beliebigen Ausdrücken erstellen können. (Bei manchen Datenbankprodukten kann nur anhand der Felder indiziert werden.) Diese Fähigkeit ermöglicht es Ihnen, zum Optimieren des Suchens, Sortierens und Verknüpfens Indizes auf einer Kombination von Feldern oder mittels Feldern gebildeter Ausdrücke zu bilden. So können Sie z. B. ein Namensfeld basierend auf einem Ausdruck indizieren, der die Funktion SOUNDEX( ) verwendet. Die Anwendung kann dann extrem schnellen Zugriff auf ähnlich klingende Namen bieten.
Beim Hinzufügen von Indizes zu Tabellen muss der Vorteil der höheren Zugriffsgeschwindigkeit gegen den Nachteil des Leistungsverlustes beim Aktualisieren der Tabelle abgewogen werden. Je mehr Indizes Sie einer Tabelle hinzufügen, desto langsamer werden Aktualisierungen und Einfügungen in die Tabelle, da Visual FoxPro jeden einzelnen Index aktualisieren muss.
Außerdem sollten keine Indizes für Felder verwendet werden, die nur einige diskrete Werte (z. B. Boolesche Werte) enthalten können. In diesen Fällen enthielte der Index nur wenige Einträge und der Aufwand zur Verwaltung des Indexes wäre wesentlich höher als der bei einer Suche gewonnene Vorteil.
Weitere Informationen zur effizienten Indizierung mittels Rushmore-Technologie finden Sie unter Verwenden von Rushmore zum Beschleunigen des Datenzugriffs.
Optimieren von Verknüpfungen
Beim Erstellen von Verknüpfungen mittels SELECT - SQL kann in folgenden Fällen die Leistung reduziert werden bzw. können unerwartete Resultate auftreten:
- Verknüpfen von Tabellen anhand von Daten, die in einer der Tabellen keine Primärschlüssel oder eindeutige Schlüssel sind.
- Verknüpfen von Tabellen mit leeren Feldern.
Um diese Fälle zu vermeiden, sollten Sie nur Verknüpfungen erstellen, die auf einer Verbindung zwischen Primärschlüsseln in der einen und Fremdschlüsseln in der anderen Tabelle basieren. Bei Erstellung einer Verknüpfung, die nicht auf eindeutigen Daten basiert, kann sich das Endergebnis als das Produkt (im mathematischen Sinne) zweier Tabellen herausstellen. Die folgende SELECT - SQL-Anweisung erstellt beispielsweise eine Verknüpfung, durch die ein sehr großes Ergebnis zurückgegeben wird:
SELECT *;
FROM tastrade!customer INNER JOIN tastrade!orders ;
ON Customer.postal_code = Orders.postal_code
In diesem Beispiel identifiziert die Postleitzahl zwar eindeutig einen Zustellbezirk, jedoch hat diese Angabe wenig Wert, wenn Sie Kunden mit Bestellungen verknüpfen möchten. Postleitzahlen können im Normalfall weder Kunden noch Bestellungen eindeutig identifizieren. Stattdessen sollten Sie eine Verknüpfung mit einer Anweisung wie der folgenden erstellen:
SELECT *;
FROM tastrade!customer INNER JOIN tastrade!orders ;
ON Customer.customer_id = Orders.customer_id
In diesem Beispiel identifiziert das Feld customer_id
eindeutig einen Kunden sowie die zu diesem gehörenden Bestellungen. Im Resultset werden daher die Kundenzeilen mit den Bestellungszeilen verknüpft.
Des Weiteren ist beim Verknüpfen von Tabellen mit leeren Feldern Vorsicht geboten, da Visual FoxPro auch leere Felder miteinander verknüpft. Es werden jedoch keine Felder miteinander verknüpft, die Null enthalten. Beim Erstellen einer Verknüpfung sollten Sie die in der Verknüpfungsbedingung verwendeten Ausdrücke dahingehend qualifizieren, dass diese auf eine leere Zeichenkette prüfen.
Kann z. B. nicht ausgeschlossen werden, dass das Feld customer_id
der Tabelle "Orders" leer ist, können Sie mit einer Anweisung wie der folgenden Bestellungsdatensätze ohne Kundennummer ausfiltern:
SELECT *;
FROM tastrade!customer INNER JOIN tastrade!orders ;
ON Customer.customer_id = Orders.customer_id;
WHERE tastrade!orders <> ""
Tipp Sie können auch mit Hilfe der Funktion EMPTY( ) auf eine leere Zeichenkette überprüfen, jedoch ist der Aufruf einer Funktion im Filterausdruck langsamer als der Vergleich mit einem konstanten Wert.
Verwenden des Projekt-Managers
Mit Hilfe des Projekt-Managers können Sie eine unbeschränkte Zahl von Programmen und Prozeduren zu einer einzigen APP- oder EXE-Datei kombinieren. Dies bewirkt aus einer Vielzahl von Gründen eine signifikante Erhöhung der Ausführungsgeschwindigkeit des Programms.
Zunächst einmal öffnet Visual FoxPro eine Programmdatei und lässt diese geöffnet. Führen Sie später einen DO-Befehl auf einem in dieser Datei enthaltenen Programm aus, muss Visual FoxPro keine zusätzliche Datei öffnen.
Weiterhin reduziert eine nur aus einer oder zwei Dateien bestehende Anwendung die Zahl der im Arbeitsverzeichnis benötigten Dateien. Die Geschwindigkeit aller Dateioperationen nimmt dabei zu, da das Betriebssystem beim Öffnen, Umbenennen und Löschen von Dateien weniger Verzeichniseinträge untersuchen muss.
Weitere Informationen zur Verwendung des Projekt-Managers bei der Erstellung von Anwendungen finden Sie unter Kompilieren einer Anwendung.
Allgemeine Tipps zur Optimierung von Tabellen und Indizes
Beachten Sie die folgenden Empfehlungen, um schnellstmögliche Tabellen und Indizes zu erstellen.
- Sofern keine Zwischenspeicherung für Datensätze oder Tabellen aktiviert ist, sollten Sie anstatt APPEND BLANK mit einem nachfolgenden REPLACE den Befehl INSERT - SQL verwenden, da dabei die Indizes nur einmal aktualisiert werden müssen. Dies gilt insbesondere bei indizierten Tabellen in einer Mehrbenutzerumgebung.
- Möchten Sie einer indizierten Tabelle viele Datensätze hinzufügen, kann es möglicherweise schneller sein, den Index zu entfernen, die Datensätze anzufügen und dann den Index neu zu erstellen.
- In SQL-Anweisungen (insbesondere in solchen, die mehr als einen Datensatz zurückgeben) sollten Sie nach Möglichkeit Funktionsaufrufe vermeiden, da die Anweisung für jeden Datensatz neu ausgewertet werden muss (und damit die Funktion erneut aufgerufen werden muss). Bei Erstellung einer SQL-Anweisung mit variablen Daten, sollten der Verwendung von Namensausdrücken und der Makrosubstitution der Vorzug vor der Funktion EVALUATE( ) gegeben werden. Eine noch bessere Strategie ist es, die ganze Anweisung, und nicht nur einzelne Klauseln, dynamisch zu konstruieren. Weitere Informationen finden Sie in der Hilfe unter Verwenden von Makros und Erstellen von Namensausdrücken.
- Verwenden Sie normalerweise eine bestimmte Indexreihenfolge, können Sie die Leistung durch regelmäßiges Sortieren der Tabelle nach dieser Reihenfolge verbessern.
- In Mehrbenutzerumgebungen sollten CDX- statt IDX-Dateien verwendet werden, da eine CDX-Datei schneller aktualisiert werden kann als mehrere IDX-Dateien.
Siehe auch
Optimieren von Anwendungen | Optimieren des Systems | Verwenden von Rushmore™ zum Beschleunigen des Datenzugriffs | Optimieren von Formularen und Steuerelementen | Optimierung von Programmen