Indexerstellung auf der Grundlage von Ausdrücken

Sie können die Leistung Ihrer Anwendungen steigern, indem Sie Indizes erstellen, die auf Ausdrücken basieren. Diese Ausdrücke können je nach ihrer Aufgabe einfach oder komplex sein.

Indizieren nach einfachen Ausdrücken

Einfache Indexausdrücke sind Indizes, die auf einzelnen Feldern oder auf der Verkettung von zwei oder mehr Zeichenfeldern zum Erstellen eines Mehrfelderschlüssels basieren. So möchten Sie zum Beispiel einen Index für die Tabelle Customer in der Datenbank der Tasmanischen Handelsgesellschaft (TasTrade) erstellen, der auf dem folgenden Ausdruck basiert:

country + region + cust_id

Wenn Sie die nach diesem Indextag sortierte Tabelle durchsuchen, werden die Kunden zunächst nach Land, dann nach Region und schließlich nach Kundencode sortiert angezeigt.

Verhindern von Duplikaten in einer Felderkombination

Wenn Sie verhindern möchten, dass Werte über mehrere Felder dupliziert werden, können Sie einen Primärindex oder potenziellen Index erstellen, der auf dem Ausdruck für eine Felderkombination basiert.

Beispielsweise verfügen Sie über eine Tabelle, in der die Ortskennzahl und die Telefonnummer in zwei Spalten gespeichert sind:

Ortskennzahl Telefonnummer
206 444-nnnn
206 555-nnnn
313 444-nnnn

Sowohl das Feld für die Ortskennzahl als auch das Feld für die Telefonnummer enthalten Werte, die die Werte in anderen Zeilen duplizieren. Telefonnummern werden jedoch nicht dupliziert, weil nur die Kombination der beiden Felder zusammen den Wert ergeben. Doch wenn der Primär- oder potenzielle Index beide Spalten im Indexausdruck angibt, werden die Zeilen im Beispiel nicht als Duplikate betrachtet. Bei einem Versuch, einen Wert einzugeben, der mit der Ortskennzahl und der Telefonnummer in einer der vorhandenen Zeilen exakt übereinstimmt, würde Visual FoxPro die Eingabe als Duplikat zurückweisen.

Verwenden von Nullwerten in Indexausdrücken

Sie können Indizes für Felder erstellen, die Nullwerte enthalten. Mit .NULL. ausgewertete Indexausdrücke werden in die CDX- oder IDX-Datei vor Nichtnulleinträgen eingefügt. Sämtliche Nullwerte werden an den Anfang des Indexes gesetzt.

Das folgende Beispiel veranschaulicht ein Ergebnis des Indizierens von Nullwerten. Dies ist der "Zustand" der Tabelle, bevor der Index übernommen wird:

Für beide Datensätze im Feld SocSec werden Nullwerte angezeigt

In beiden Datensätzen teilt der Wert .NULL. mit, dass die Sozialversicherungsnummern für Anne Dunn und Alan Carter entweder unbekannt oder nicht verfügbar sind. Der folgende Code erstellt dann einen Index mit der Sozialversicherungsnummer:

INDEX ON SocSec + LastName + FirstName TAG MyIndex

Nach dem Sortieren mit diesem Index wird die Tabelle wie in der folgenden Abbildung dargestellt.

Nach dem Indizieren nach SocSec werden die Datensätze mit SocSec-Nullwerten zuerst angezeigt

Wenn der Indexausdruck Nullwerte enthält, werden die Datensätze, deren SocSec-Werte .NULL. sind, zuerst sortiert (nach LastName). Ihnen folgen dann die Datensätze, deren SocSec-Werte ungleich Null sind. Beachten Sie die beiden Einträge für Alan Carter. Weil Datensatz 5 einen Nullwert enthält, wird Datensatz 5 vor Datensatz 2 indiziert.

Indizieren nach komplexen Ausdrücken

Sie können auch Indizes erstellen, die auf komplexeren Ausdrücken beruhen. Visual FoxPro-Indexausdrücke können Visual FoxPro-Funktionen, Konstanten oder benutzerdefinierte Funktionen enthalten.

Der erstellte Ausdruck darf auf nicht mehr als 100 Zeichen für einen eigenständigen Index (IDX) bzw. 240 Zeichen für einen CDX-Indextag ausgewertet werden. Sie können Felder unterschiedlicher Datentypen zusammen in einem Indextag verwenden, indem Sie die einzelnen Komponenten des Ausdrucks in Zeichendaten umwandeln.

Um die Vorteile der Rushmore™-Optimierung nutzen zu können, muss der Indexausdruck genau den Kriterien entsprechen.

Verwenden von Visual FoxPro-Funktionen in einem Indexschlüssel

Sie können Visual FoxPro-Funktionen in einem Indextag verwenden. So können Sie zum Beispiel einen numerischen Wert mit Hilfe der STR( )-Funktion in eine Zeichenfolge umwandeln. Wenn Sie für die Tabelle customer einen Indextag erstellen möchten, der das Feld cust_id mit dem Feld maxordamt kombiniert, könnten Sie maxordamt (Feldtyp Währung, Feldbreite 8) mit dem folgenden Code in ein 8-Zeichen-Feld mit 2 Dezimalstellen umwandeln:

INDEX ON cust_id + STR(maxordamt, 8, 2) TAG custmaxord

Wenn Sie die Größe von Indizes für Felder mit Integerwerten verringern möchten, können Sie die Integerwerte mit der BINTOC( )-Funktion in eine binäre Zeichendarstellung umwandeln. Binäre Werte können mit der CTOBIN( )-Funktion in Integerwerte umgewandelt werden.

Wenn Sie einen Index erstellen möchten, um eine Tabelle in chronologischer Reihenfolge zu sortieren, können Sie ein Datumsfeld mit Hilfe der DTOS( )-Funktion in eine Zeichenfolge umwandeln. Um auf die Tabelle employee nach hire_date und emp_id zuzugreifen, können Sie den folgenden Indexausdruck erstellen:

INDEX ON DTOS(hire_date) + emp_id TAG id_hired

Einbeziehen von gespeicherten Prozeduren oder benutzerdefinierten Funktionen

Sie können die Leistung Ihres Indexes steigern, indem Sie in Ihrem Indexausdruck auf eine gespeicherte Prozedur oder eine benutzerdefinierte Funktion (UDF) verweisen. Beispielsweise können Sie mit einer gespeicherten Prozedur oder einer UDF aus einem einzelnen Feld, das die Hausnummer und den Straßennamen enthält, den Straßennamen herausziehen. Wenn die Hausnummer immer numerisch ist, gibt die gespeicherte Prozedur oder die UDF den Zeichenteil des Feldes zurück und füllt das Feld nach Bedarf mit Leerzeichen auf, um einen Indexschlüssel von konstanter Länge zu erstellen. Mit Hilfe dieses Schlüssels können Sie dann auf die Datensätze der Tabelle in der Reihenfolge der Straßennamen zugreifen.

Falls Ihre Tabelle mit einer Datenbank verbunden ist, möchten Sie in Ihrem Indextag möglicherweise lieber eine gespeicherte Prozedur als eine UDF verwenden. Weil eine UDF in einer von der Datenbank unabhängigen Datei gespeichert wird, ist es möglich, die UDF-Datei zu verschieben oder zu löschen. Hierdurch wird der Indexschlüssel, der auf die UDF verweist, ungültig. Im Gegensatz dazu wird gespeicherter Prozedurcode in der DBC-Datei gespeichert.

Mit der Bezugnahme auf eine solche Prozedur bestimmen Sie, dass der Index genau auf dem von Ihnen festgelegten Code basiert. Wenn Sie in Ihrem Indexausdruck eine UDF angeben, wird jede beliebige UDF verwendet, die sich beim Indizieren innerhalb des Bereichs befindet und denselben Namen wie die UDF hat, auf die in Ihrem Index Bezug genommen wird.

Anmerkung   Überlegen Sie sorgfältig jede Bezugnahme auf eine gespeicherte Prozedur oder eine UDF in einem Indexausdruck, da dadurch das Erstellen oder Aktualisieren des Indexes länger dauert.

Verwenden von Daten aus einem Feld einer anderen Tabelle

Sie können einen Indextag erstellen, der auf eine geöffnete Tabelle in einem anderen Arbeitsbereich verweist. Dabei empfiehlt es sich, für jeden Schlüssel, der auf mehrere Tabellen Bezug nimmt, einen eigenständigen Index (IDX) zu verwenden. Wenn Sie nämlich einen Schlüssel, der auf eine andere Tabelle Bezug nimmt, in eine strukturierte CDX-Datei einbeziehen, lässt Visual FoxPro das Öffnen der Tabelle erst zu, nachdem Sie die Tabelle geöffnet haben, auf die der Indexschlüssel Bezug nimmt.

Siehe auch

Löschen eines Indexes | Zugreifen auf Datensätze in absteigender Reihenfolge | Arbeiten mit Datensätzen | STR( ) | BINTOC( ) | Filtern von Daten | Erstellen eines Indexes | Erstellen mehrerer Indizes | Ordnen nach mehreren Feldern | Indexerstellung für Tabellen