Indexschlüssel

Gilt für: Windows | Windows Server

Indexschlüssel

Ein Index wird über Daten in der Tabelle mit JetCreateIndex erstellt, oder mehrere Indizes können gleichzeitig mit JetCreateIndex2 erstellt werden, indem die JET_INDEXCREATE-Struktur verwendet wird. Der Index wird im Hinblick auf ein Array von Spalten in rangfolgengeordneter Reihenfolge definiert. Dieses Array von Spalten wird auch als Indexschlüssel bezeichnet. Der Indexschlüssel kann als primärer Index definiert werden, wenn die option JET_bitIndexPrimary im grbit-Parameter von JetCreateIndex oder JET_INDEXCREATEfestgelegt ist. Der Indexschlüssel ist eine auf NULL endende Zeichenfolge mit NULL-Terminierungstoken, wie im folgenden Beispiel gezeigt:

+Col1 \ 0-Col2 \ 0+Col3 \ 0 \ 0

Der Schlüssel im Beispiel kann verwendet werden, um einen Index für drei Spalten in der Tabelle zu erstellen. Jede im Index angegebene Spalte wird als "Indexsegment" oder "Schlüsselspalte" bezeichnet. Das Indexsegment kann hinsichtlich seines Sortierbeitrags entweder aufsteigend oder absteigend sein. Im obigen Beispiel lautet der Name der ersten Spalte im Index Col1. +gibt an, dass Col1 in aufsteigender Reihenfolge indiziert wird. Die - vor Col2 gibt an, dass sie in absteigender Reihenfolge indiziert ist.

Wenn bedingte Spalten im Index vorhanden sind, wird die JET_CONDITIONALCOLUMN Struktur verwendet, um anzugeben, wie sie indiziert werden. Eine bedingte Spalte kann verwendet werden, um das Vorhandensein oder Fehlen eines Indexeintrags in einem Index basierend auf dem Wert in der entsprechenden bedingten Spalte zu steuern, ohne die Sortierreihenfolge des Indexes zu beeinflussen. Eine bedingte Spalte kann einen Indexeintrag aus dem Index einschließen oder ausschließen, wenn der Wert dieser bedingten Spalte NULL für den entsprechenden Datensatz ist.

Standardmäßig wird die maximale Größe des Indexschlüssels durch die JET_cbKeyMost Konstante angegeben, die immer 255 Byte normalisierter Daten (Datenbytes einschließlich des Indizierungsaufwands) betragen hat. Ab Windows Vista kann die maximale Größe des Indexschlüssels mit der JET_INDEXCREATE-Struktur festgelegt werden. Die maximale Größe des Indexschlüssels entspricht der Größe der Datenbankseite. Um eine benutzerdefinierte maximale Schlüsselgröße zu aktivieren, geben Sie die option Jet_bitIndexKeyMost im grbits-Member von JET_INDEXCREATEan, und legen Sie den cbKeyMost-Member auf einen der folgenden Werte fest:

  • JET_cbKeyMost2KBytePage: Wenn die Datenbankseitengröße 2.048 Byte beträgt, kann die maximale Indexschlüsselgröße zwischen 255 Byte und maximal 500 Bytes betragen.

  • JET_cbKeyMost4KBytePage: Wenn die Datenbankseitengröße 4.096 Byte beträgt, kann die maximale Indexschlüsselgröße zwischen 255 Byte und maximal 1.000 Bytes betragen.

  • JET_cbKeyMost8KBytePage: Wenn die Datenbankseitengröße 8196 Byte beträgt, kann die maximale Indexschlüsselgröße zwischen 255 Byte und maximal 2.000 Bytes betragen.

Das Beispiel im folgenden Diagramm zeigt eine Tabelle mit Mitarbeiterinformationen. Die Tabelle enthält 6 Spalten, von denen jede ein bestimmtes Mitarbeiterattribut definiert. Ein Datensatz in der Tabelle enthält Werte für einen Mitarbeiter, z. B. den Mitarbeiternamen in Spalte 1 und die Mitarbeiter-ID in Spalte 2. Ein primärer Index, der für diese Tabelle erstellt wurde, organisiert die Daten anhand des Mitarbeiternamens und der Mitarbeiter-ID an zweiter Stelle. Name und ID werden in aufsteigender Reihenfolge indiziert. Beispielsweise wird vor einem Datensatz mit dem Mitarbeiternamen Jones und der ID 10000 ein Datensatz mit dem Namen Jones und der Mitarbeiter-ID 12345 aufgeführt. Alle Datensätze für Jones werden zusammen in der Tabelle gespeichert, und ihre Mitarbeiter-IDs werden in aufsteigender Reihenfolge gespeichert, wie in der Tabelle dargestellt.

ESE_Documentation_IndexTable

Der Schlüssel im primären Index muss eindeutig sein, aber die Schlüssel im sekundären Index können Duplikate sein. Wenn z. B. ein Index über den Nachnamen erstellt wird und zwei Personen mit Einem in der Datenbank vorhanden sind, gibt ESE einen Jet_errKeyDuplicate Fehler von JetUpdate oder JetUpdate2zurück, wenn die Anwendung versucht, den zweiten "Domänennamen" einzufügen. Wenn der tatsächliche Schlüssel größer als die maximale Schlüsselgröße ist, wird der Schlüssel abgeschnitten. Das Abschneiden von Schlüsseln wirkt sich auf die Suche und Eindeutigkeit aus und sollte von der Anwendung verwaltet werden. Wenn z. B. "Datensätze" und "Maximson" in einem Index über dem Nachnamen gespeichert wurden und die maximale Schlüsselgröße zu klein zum Speichern des "on"-Teils von "Maximson" war, würde das Abschneiden von Schlüsseln dazu führen, dass die Datenbank-Engine deklariert, dass "Datensätze" und "Filialenson" Duplikate sind, obwohl sie dies nicht sind. Die Anwendung muss darauf vorbereitet sein, solche Fälle während der Suche und Aktualisierung zu behandeln, wenn die Indexdefinition und die von ihr indizierten Spaltenwerte so sind, dass das Abschneiden von Schlüsseln möglich ist. Ab Windows Vista können Anwendungen die option Jet_bitIndexDisallowTruncation in JET_INDEXCREATE oder JetMakeKeyangeben. Die Angabe dieses Flags führt dazu, dass jede Aktualisierung des Indexes, die zu einem abgeschnittenen Schlüssel führen würde, mit JET_errKeyTruncated fehlschlägt. Andernfalls werden Schlüssel automatisch abgeschnitten. Dadurch kann die Anwendung ohne Bedenken für die Artefakte funktionieren, die durch das zuvor beschriebene Abschneiden von Schlüsseln verursacht wurden.