![]() Home Grundsätzliches Installation Konfiguration Erste Schritte Laufzeitschalter Textdateien Systemfunktionen Tabellenfunktionen Indexfunktionen Volltext-Indizierung Memos und Blobs Semaphoren-Konzept Support Datenbank Einführungskurs |
IndexfunktionenAllgemeines zu IndizesDie Indizes des tdbengine Funktionen zum Erzeugen, Löschen und Auffrischen von Indizes Zugriffsreihenfolge ermitteln und festlegen Datensatz über Index suchen Filter setzen Die Filter-Automatik der tdbengine Allgemeines zu IndizesEin Index ist eine Art Stichwortverzeichnis einer Tabelle, das in einer speziellen Ordnung angelegt wird und dadurch einen sehr schnelle Suche nach Datensätzen erlaubt. Zur Bildung eines solchen Stichwortverzeichnisses können im Prinzip alle Feldtypen verwendet werden, ausgenommen sind hier nur Memos, Blobs und Relationen.Indizes werden benötigt
Eine Reihe von Indizes wird automatisch angelegt: Falls die Tabelle ein AUTO-INCREMENT-Feld enthält, wird über
dieses Feld eine Index erzeugt (Extension .inr).
Zusätzliche Indizes können ebenfalls in der Strukturdefinition
angegeben werden:
ind-name = Name der Indexdatei mit Extension .ind
Wichtig: Die Namen der Indizes sollten derzeit (ohne Extension) nicht mehr als 8 Zeichen umfassen und nur Buchstaben (ohne Umlaute) enthalten. Die Indizes des tdbengineÜber jede Tabelle können beliebig viele (in der aktuellen Version 6.2.6 bis zu 15) Indizes erzeugt werden. Die tdbengine bietet hierarchische Indizes mit bis zu 10 Hierarchiestufen und berechnete Indizes.Die Definition eines Index erfolgt über eine Indexbeschreibung. Diese hat folgendes Format: Hierarchischer Index::=Feld-Def{","Feld-Def}.
Berechneter Index::="("Ausdruck")"[":"Zahl] Beispiele: Hierarchischer Index: Name,Vorname:1,PLZ
Die optionale Angabe :Zahl nach einem Feld (bzw. nach einem Ausdruck) wird nur bei String-Feldern (bzw. bei String-Ausdrücken) ausgewertet und gibt an, wieviele Zeichen des Strings (maximal) in die Indexinformation übernommen werden. Folgende Einschränkungen für Indexbeschreibungen gelten derzeit (Version 6.2.5):
Funktionen zum Erzeugen, Löschen und Auffrischen von IndizesHinweis: Die folgenden Funktionen werden nur dann ausgeführt, wenn die Tabelle mit dem Recht "Indizieren" (=8) geöffnet wurde.Index erzeugenGenIndex(db : REAL; IndDef : STRING; IndName : STRING) : REALdb : Tabellenhandle von OpenDB
Rückgabewert: 0 : Funktion konnte nicht ausgeführt werden (Fehlercode mit TDB_LastError)
Häufigster Fehler: "Index existiert bereits". Die tdbengine erzeugt keinen Index, wenn eine (Index-)Datei gleichen Namens im Verzeichnis der zu indizierenden Tabelle ist. Wichtig: Der Index wird immer im gleichen Verzeichnis
wie die zugehörige Tabelle abgelegt. Der Name der Indexdatei sollte
immer die Extension .ind haben. Die Dateinamen sollten der 8.3-Konvention
entsprechen, also xxxxxxxx.ind. Auch Verzeichnisangaben sind nicht
zulässig!
In den folgenden Funktionen kann der Parameter Index entweder durch den Indexnamen (mit Extension) oder durch die Indexnummer angegeben werden (gilt erst ab Version 6.2.6, frühere Versionen nur Indexummer bzw. nur Indexname bei FindRec). Index löschenDelIndex(db : REAL; Index) : REALdb : Tabellenhandle von OpenDB
Rückgabewert: 0 = Funktion erfolgreich ausgeführt, sonst Fehlercode Häufigster Fehler: "Index ist noch in Gebrauch". Solange der Index der aktive Zugriff einer geöffneten Tabelle ist, kann er nicht entfernt werden. Achtung: Der betreffende Index wird definitiv gelöscht und aus der Tabelle entfernt. Die Funktion sollte mit größter Vorsicht eingesetzt werden: Da Tabellen zu mehreren Projekten gehören können, weiss ein Projekt oft nichts von der Notwendigkeit eines Index in einem anderen Projekt. Nach DelIndex werden alle höheren Indexnummer um 1 dekrementiert. Index auffrischenRegenInd(db : REAL; Index) : REALdb : Tabellenhandle von OpenDB
Rückgabewert: 0 = Funktion erfolgreich ausgeführt, sonst Fehlercode Alle Indizes werden automatisch mit der zugehörigen Tabelle aktualisiert, so dass sich im Normalfall keine Notwendigkeit zum Auffrischen ergibt. Allerdings wird im Laufe der Zeit (nach vielen Änderungen an der Tabelle) die Auslastung des zugrunde liegenden B-Trees immer schlechter, so dass dann das Auffrischen eines Index dazu führt, dass
Alle Indizes auffrischenRefresh(db : REAL) : REALdb : Tabellenhandle von OpenDB
Damit werden sämtliche Indizes einer Tabelle aufgefrischt. Achtung: Die Funktionen zur Index-Aufrischung dürfen nicht auf Tabellen angewandt werden, die über ScanRecs im Minimalmodus erzeugt wurden. Indexbeschreibung ermitteln IndexDef(db : REAL; Index) : STRING
Zugriffsreihenfolge ermitteln und festlegenFür jede geöffnete Tabelle kann eine Zugriffsreihenfolge eingestellt werden, die für folgende Funktionen relevant ist:
Access(db : REAL[; Index]) : REAL Ohne Index-Paramter wird die aktuelle Zugriffsreihenfolge zurückgeliefert (erst ab Version 6.2.6): -2 : Markierungsliste
Beim Index kann zusätzlich zu den Indexnamen (oder -nummern) noch folgendes angegeben werden: -2 oder "Markierung"
IndexNo(db : REAL) : REAL Liefert Zugriffsreihenfolge (alte Version): -2 : Markierungsliste
IndName(db : REAL; Index) : STRING Liefert den Namen des angegeben Index. Datensatz über Index suchenFindRec(db : REAL; SearchStr : STRING [;Index[;Mode : REAL]]) : REALdb : Tabellenhandle von OpenDB
Rückgabewert: 0 -> kein Datensatz gefunden, ansonsten recno(db) Bemerkungen: Der SearchStr muss adäquat zur Index-Beschreibung aufgebaut sein. Enthält eine Komponente ein Komma, so muss diese geklammert werden. Beispiele: Index-Beschreibung ="Name,Vorname,Ort"
Werden die Informationen vom Anwender geholt, ist eine Klammerung für alle Komponenten sinnvoll: SearchStr:='('+s_Name+'),('+s_Vorname+'),('+s_Ort+')' Wird kein Index angegeben, so wird im aktuellen (mittels access eingestellten) Index gesucht. Steht der Zugriff nicht auf einem Index (sondern auf Nummer oder Markierung), so erfolgt die Fehlermeldung "Illegaler Zugriff"). Mit dem Modus 0 wird der (bzgl. der Index-Ordnung) kleinste Eintrag gesucht, der gleich oder größer dem gesuchten ist. Ist hier kein Eintrag vorhanden, so wird der größte Eintrag gesucht, der gleich oder kleiner dem gesuchten ist. In diesem Modus wird also nur dann 0 zurückgeliefert, wenn die Tabelle komplett leer ist. Im Modus 1 wird hingegen nur dann ein Wert ungleich 0 geliefert, wenn ein Eintrag gefunden wird, der in allen Komponenten mit der Suche übereinstimmt. Beispiel: Tabelle db:
Index 1 Beschreibung: "Name,Vorname,Ort"
Index 1 (intern)
FindRec(db,"Meier,Franz,München",1,0) -> 1
Index 2 (intern)
FindRec(db,"Meier/Hans",2,0) -> 4
Filter setzenDurch einen Index wird eine Tabelle in eine Ordnung gebracht. Mit einem Filter wird bezüglich dieser Ordnung eine zusammenhängende Teilmenge (ein Ausschnitt) aus der Tabelle definiert.SetFilter(db : REAL; von [, bis] : STRING) : REAL db : Tabellenhandle von OpenDB
Rückgabewert: Immer 0 SetFilter ist nur wirksam, wenn der Zugriff auf einen Index gesetzt wurde, also erst nach access(db,...). Ein Filter ist solange aktiv, bis er
Der Parameter bis kann nur weggelassen werden, wenn die zugehörige Indexbeschreibung ausschließlich String-Felder enthält: SetFilter(db,von) steht dann als Abkürzung für SetFilter(db,von,von+chr(255)). Bei einem hierarchischen Index werden nicht angegebene Komponenten bei
von
mit dem kleinsten, bei bis mit dem größten möglichen
Wert aufgefüllt.
Die Filter-Automatik der tdbengineBei der Bearbeitung von Selektionen versucht die tdbengine die zu lesende Datenmenge und damit den Selektionsaufwand zu minimieren, indem sie alle vorhandenen Indizes daraufhin untersucht, ob ein passender Filter gesetzt werden kann. Diese Automatik arbeitet unabhängig von der Reihenfolge der logischen Operationen und auch unabhängig von der verkürzten Logikauswertung.Die Automatik wird abgeschaltet, wenn zum Zeitpunkt der Selektion
[STRUCTURE]
Die Filter-Automatik sorgt dafür, dass die Funktion SetFilter nur
in wenigen Spezialfällen eingesetzt werden muss.
|