JetIntersectIndexes-Funktion

Gilt für: Windows | Windows Server

JetIntersectIndexes-Funktion

Die JetIntersectIndexes-Funktion berechnet die Schnittmenge zwischen mehreren Sätzen von Indexeinträgen aus verschiedenen sekundären Indizes über dieselbe Tabelle. Dieser Vorgang ist nützlich, um den Satz von Datensätzen in einer Tabelle zu finden, die zwei oder mehr Kriterien erfüllen, die mithilfe von Indexbereichen ausgedrückt werden können.

    JET_ERR JET_API JetIntersectIndexes(
      __in          JET_SESID sesid,
      __in          JET_INDEXRANGE* rgindexrange,
      __in          unsigned long cindexrange,
      __in_out      JET_RECORDLIST* precordlist,
      __in          JET_GRBIT grbit
    );

Parameter

sesid

Die Sitzung, die für diesen Aufruf verwendet werden soll.

rgindexrange

Ein Zeiger auf ein Array von JET_IndexRange Strukturen. Jede Struktur enthält eine JET_TABLEID , die so eingerichtet wurde, dass sie einen der zu überschneidenden Indexbereiche enthält. Weitere Informationen finden Sie unter JET_IndexRange.

cindexrange

Die Anzahl der JET_IndexRange Strukturen im Array, das im rgindexrange-Parameter enthalten ist.

precordlist

Zeiger auf eine JET_RECORDLIST-Struktur . Diese Struktur wird mit genügend Informationen aufgefüllt, um die temporäre Tabelle mit den Ergebnissen aus JetIntersectIndexes zu durchlaufen.

Der Ausgabepuffer, der eine JET_RECORDLIST-Struktur empfängt. Die -Struktur enthält eine Beschreibung des Resultsets der Schnittmenge.

grbit

Für die zukünftige Verwendung reserviert.

Rückgabewert

Diese Funktion gibt den Datentyp JET_ERR mit einem der folgenden Rückgabecodes zurück. Weitere Informationen zu ESE-Fehlern finden Sie unter Fehler der erweiterbaren Speicher-Engine und Fehlerbehandlungsparameter.

Rückgabecode

Beschreibung

JET_errSuccess

Der Vorgang wurde erfolgreich abgeschlossen.

JET_errClientRequestToStopJetService

Es ist nicht möglich, den Vorgang abzuschließen, da alle Aktivitäten auf der instance, die der Sitzung zugeordnet sind, aufgrund eines Aufrufs von JetStopService beendet wurden.

JET_errInstanceUnavailable

Es ist nicht möglich, den Vorgang abzuschließen, da für die instance, die der Sitzung zugeordnet ist, ein schwerwiegender Fehler aufgetreten ist, der erfordert, dass der Zugriff auf alle Daten widerrufen wird, um die Integrität dieser Daten zu schützen.

Windows XP: Dieser Rückgabewert wird in Windows XP eingeführt.

JET_errInvalidgrbit

Eine der angeforderten Optionen war ungültig, falsch verwendet oder nicht implementiert.

Dieser Fehler wird von JetIntersectIndexes zurückgegeben, wenn:

Das grbit , das in der JET_IndexRange Struktur enthalten ist, auf die jedes Element im rgindexrange-Array verweist, ist nicht gleich JET_bitRecordInIndex.

JET_errInvalidParameter

Einer der bereitgestellten Parameter enthält einen unerwarteten Wert oder einen Wert, der in Kombination mit dem Wert eines anderen Parameters inkonsistent ist.

Dieser Fehler wird von JetIntersectIndexes aus den folgenden Gründen zurückgegeben:

  • Der precordlist-Parameter ist NULL.

  • Das cbStruct-Element der imprecordlist-Parameter angegebenen JET_RECORDLIST-Struktur ist nicht gleich der Größe der JET_RECORDLIST-Struktur .

  • Der cindexrange-Parameter ist null.

  • Der cindexrange-Parameter ist größer als 64.

  • Der cbStruct-Member für jedes Element im Array, das durch den rgindexrange-Parameter angegeben wird, ist nicht gleich der Größe der JET_IndexRange-Struktur .

  • Die Elemente im rgindexrange-Array enthalten JET_TABLEIDs aus verschiedenen Tabellen.

  • Ein Element im rgindexrange-Array enthält eine JET_TABLEID , die nicht auf einem sekundären Index positioniert ist.

  • Mindestens eines der Elemente im rgindexrange-Array enthält JET_TABLEIDs, die auf demselben sekundären Index positioniert sind.

JET_errInvalidSesid

Das Sitzungshandle ist ungültig oder bezieht sich auf eine geschlossene Sitzung.

Dieser Fehler wird nicht unter allen Umständen zurückgegeben. Handles werden nur auf der Grundlage des bestmöglichen Aufwands überprüft.

JET_errNotInitialized

Es ist nicht möglich, den Vorgang abzuschließen, da die der Sitzung zugeordnete instance nicht initialisiert wurde.

JET_errOutOfCursors

Der Vorgang ist fehlgeschlagen, weil die Engine die Ressourcen nicht zuordnen konnte, die zum Öffnen eines neuen Cursors erforderlich sind. Cursorressourcen werden durch Aufrufen von JetSetSystemParameter mit JET_paramMaxCursors konfiguriert, die im paramid-Parameter angegeben sind.

JET_errOutOfMemory

Der Vorgang ist fehlgeschlagen, weil nicht genügend Arbeitsspeicher zugeordnet werden konnte, um ihn abzuschließen.

JetIntersectIndexes kann JET_errOutOfMemory zurückgeben, wenn der Adressraum des Hostprozesses zu fragmentiert wird. Der temporäre Tabellen-Manager ordnet immer einen Adressraum von 1 MB für jede temporäre Tabelle zu, die erstellt wird, unabhängig von der Menge der zu speichernden Daten. JetIntersectIndexes erstellt eine temporäre Tabelle für jede im rgindexrange-Parameter angegebene JET_IndexRange und eine temporäre Tabelle für die Ausgabe in JET_RECORDLIST.

JET_errRestoreInProgress

Es ist nicht möglich, den Vorgang abzuschließen, da ein Wiederherstellungsvorgang für die instance ausgeführt wird, die der Sitzung zugeordnet ist.

JET_errSessionSharingViolation

Es ist unzulässig, dieselbe Sitzung aus mehreren Threads gleichzeitig zu verwenden.

Windows XP: Dieser Rückgabewert wird in Windows XP eingeführt.

JET_errTermInProgress

Es ist nicht möglich, den Vorgang abzuschließen, da die der Sitzung zugeordnete instance heruntergefahren wird.

JET_errTooManyOpenIndexes

Der Vorgang ist fehlgeschlagen, weil die Engine die Ressourcen, die zum Zwischenspeichern der Indizes der Tabelle erforderlich sind, nicht zuordnen konnte. Die Anzahl der Indizes, deren Schema zwischengespeichert werden kann, wird mithilfe von JetSetSystemParameter mit JET_paramMaxOpenTables konfiguriert, die im paramid-Parameter angegeben sind.

JET_errTooManyOpenTables

Der Vorgang ist fehlgeschlagen, weil die Engine die Ressourcen nicht zuordnen konnte, die zum Zwischenspeichern des Schemas der Tabelle erforderlich sind. Die Anzahl der Tabellen, deren Schema zwischengespeichert werden kann, wird mithilfe von JetSetSystemParameter mit JET_paramMaxOpenTables konfiguriert, die im paramid-Parameter angegeben sind.

JET_errTooManySorts

Der Vorgang ist fehlgeschlagen, weil die Engine die ressourcen, die zum Erstellen einer temporären Tabelle erforderlich sind, nicht zuordnen konnte. Temporäre Tabellenressourcen werden mithilfe von JetSetSystemParameter mit JET_paramMaxTemporaryTables konfiguriert, die im paramid-Parameter angegeben sind.

Bei Erfolg wird eine neue temporäre Tabelle zurückgegeben, die die Lesezeichen der Datensätze enthält, die den Kriterien entsprechen, die durch die beschreibungen des Eingabeindexbereichs dargestellt werden.

Bei einem Fehler wird die temporäre Tabelle mit den Ergebnissen nicht erstellt. Der Status der temporären Datenbank kann geändert werden. Der Status aller gewöhnlichen Datenbanken, die von der Datenbank-Engine verwendet werden, bleibt unverändert. Die aktuelle Position der für diese Funktion bereitgestellten JET_TABLEIDkann geändert werden.

Bemerkungen

JetIntersectIndexes kann verwendet werden, um die Datensätze in einer Tabelle effizient nach mehreren Kriterien zu filtern, wenn diese Kriterien als sekundäre Indizes für diese Tabelle ausgedrückt werden können. Stellen Sie sich beispielsweise vor, dass Sie über eine sehr große Tabelle mit Personen verfügen. Die Tabelle kann Spalten für die Benutzer-ID, den Vornamen, den Nachnamen usw. enthalten. Angenommen, jede dieser Spalten wird separat indiziert, und der primäre Index der Tabelle liegt über der Benutzer-ID. Wenn Sie alle Personen finden möchten, deren Vorname mit einem A beginnt und dessen Nachname mit G beginnt, führen Sie die folgenden Schritte aus:

  1. Öffnen Sie einen neuen Cursor in der Tabelle, und legen Sie diesen Cursor so fest, dass der Index über der Spalte "Vorname" verwendet wird. Richten Sie dann einen Indexbereich für alle Personen ein, deren "Vorname" mit "A" begann, und erstellen Sie eine JET_IndexRange Struktur, die diesen Cursor enthält.

  2. Wiederholen Sie Schritt 1 mit einem neuen Cursor auf dem Index "Nachname" für alle Personen, deren "Nachname" mit "G" begann.

  3. Übergeben Sie diese Kriterien an JetIntersectIndexes , um das Ergebnis in einer temporären Tabelle zu berechnen.

  4. Durchlaufen Sie die temporäre Tabelle, und rufen Sie jeden der Datensätze ab, die die Kriterien als Lesezeichen übergeben.

Die temporäre Tabelle, die das Resultset enthält, ist eine einfache Tabelle mit einer Spalte, die das Lesezeichen jedes Datensatzes enthält, der alle Kriterien zum Berechnen der Schnittmenge übergeben hat. Das Resultset wird in derselben Reihenfolge wie der primäre Index sortiert und enthält keine doppelten Einträge. Die Anwendung kann die Ergebnisse der Schnittmenge aufzählen, indem sie die Zeilen in der temporären Tabelle aufzählt, das Lesezeichen für jedes Ergebnis mithilfe von JetRetrieveColumn abruft und dann den Datensatz in der Datenbank aufruft, indem JetGotoBookmark mit diesem Lesezeichen auf einem Cursor aufgerufen wird, der auf dem primären Index positioniert ist.

Die temporäre Tabelle, die von JetIntersectIndexes zurückgegeben wird, kann nur vorwärts gescannt werden. Es sollte auch über JetCloseTable geschlossen werden, wenn die Überprüfung abgeschlossen wurde. Weitere Informationen zu temporären Tabellen und deren Funktionsweise finden Sie unter JetOpenTemporaryTable.

JetIntersectIndexes ist im Allgemeinen eine effiziente und bequeme Möglichkeit, Datensätze basierend auf mehreren indizierten Kriterien zu filtern. Es gibt jedoch einige wichtige Tipps, die befolgt werden sollten, um den Nutzen dieses Features zu maximieren. Wenn Sie wissen, dass eines der Kriterien so restriktiv ist, dass der resultierende Indexbereich nur sehr wenige Datensätze enthält, ist es wahrscheinlich besser, diesen Indexbereich einfach zu durchlaufen und die Datensätze auf Anwendungsebene zu filtern. Wenn Sie außerdem wissen, dass Sie über Kriterien verfügen, die viel weniger restriktiv sind als andere Kriterien in Ihrer Schnittmenge, können Sie erwägen, diese viel weniger restriktiven Kriterien aus der Schnittmenge zu entfernen. Wenn Sie schließlich wissen, dass eines der Kriterien überhaupt nicht restriktiv ist, sodass der resultierende Indexbereich fast so groß ist wie der primäre Index, dann ist es unwahrscheinlich, dass die Schnittmenge mit diesem Indexbereich dem Resultset zugute kommt (die Größe von verringern). In allen Fällen sollten Sie Kriterien auf eine Weise auswählen, die die wenigsten möglichen Indexeinträge bei der Eingabe akzeptiert und den spezifischsten Satz von Lesezeichen bei der Ausgabe generiert, um eine maximale Leistung zu erzielen.

Anforderungen

Anforderung Wert

Client

Erfordert Windows Vista, Windows XP oder Windows 2000 Professional.

Server

Erfordert Windows Server 2008, Windows Server 2003 oder Windows 2000 Server.

Kopfzeile

Deklariert in Esent.h.

Bibliothek

Verwenden Sie ESENT.lib.

DLL

Erfordert ESENT.dll.

Weitere Informationen

JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JET_IndexRange
JET_RECORDLIST
JetGotoBookmark
JetRetrieveColumn
JetSetIndexRange