次の方法で共有


JetIntersectIndexes 関数

適用対象: Windows |Windows Server

JetIntersectIndexes 関数

JetIntersectIndexes 関数は、同じテーブル上の異なるセカンダリ インデックスから複数のインデックス エントリのセット間の交差部分を計算します。 この操作は、インデックス範囲を使用して表すことができる 2 つ以上の条件に一致するテーブル内のレコードのセットを検索する場合に便利です。

    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
    );

パラメーター

sesid

この呼び出しに使用するセッション。

rgindexrange

JET_IndexRange構造体の配列へのポインター。 各構造体 には、交差 するインデックス範囲のいずれかを保持するように設定されたJET_TABLEIDが含まれています。 詳細については、「 JET_IndexRange」を参照してください。

cindexrange

rgindexrange パラメーターに含まれる配列内のJET_IndexRange構造体の数。

precordlist

JET_RECORDLIST構造体へのポインター。 この構造体には、 JetIntersectIndexes の結果を含む一時テーブルを走査するのに十分な情報が設定されます。

JET_RECORDLIST構造体を受け取る出力バッファー。 構造体には、交差部分の結果セットの説明が含まれています。

grbit

将来利用するために予約されています。

戻り値

この関数は、次のいずれかのリターン コードを使用して 、JET_ERR データ型を返します。 ESE エラーの詳細については、「 記憶域エンジンの拡張可能 エラー」および「 エラー処理パラメーター」を参照してください。

リターン コード

説明

JET_errSuccess

操作は正常に完了しました。

JET_errClientRequestToStopJetService

JetStopService の呼び出しの結果、セッションに関連付けられたインスタンス上のすべてのアクティビティが停止したため、操作を完了することはできません。

JET_errInstanceUnavailable

セッションに関連付けられているインスタンスで致命的なエラーが発生したため、操作を完了できません。このエラーでは、そのデータの整合性を保護するためにすべてのデータへのアクセスを取り消す必要があります。

Windows XP: この戻り値は Windows XP で導入されています。

JET_errInvalidgrbit

要求されたオプションの 1 つが無効であるか、正しく使用されていないか、実装されていませんでした。

このエラーは、次の場合に JetIntersectIndexes によって返されます。

rgindexrange 配列内の要素が指すJET_IndexRange構造体に含まれる grbit は、JET_bitRecordInIndexと等しくありません。

JET_errInvalidParameter

指定されたパラメーターの 1 つに、予期しない値または別のパラメーターの値と組み合わせると一貫性のない値が含まれています。

このエラーは、次の理由により JetIntersectIndexes によって返されます。

  • precordlist パラメーターは NULL です。

  • precordlist パラメーターで指定されたJET_RECORDLIST構造体の cbStruct メンバーは、JET_RECORDLIST構造体のサイズと等しくありません。

  • cindexrange パラメーターは 0 です。

  • cindexrange パラメーターが 64 を超えています。

  • rgindexrange パラメーターで指定された配列内の任意の要素の cbStruct メンバーは、JET_IndexRange構造体のサイズと等しくありません。

  • rgindexrange 配列の要素には、さまざまなテーブルのJET_TABLEIDが含まれています。

  • rgindexrange 配列の要素には、セカンダリ インデックスに配置されていないJET_TABLEIDが含まれています。

  • rgindexrange 配列内の 1 つ以上の要素には、同じセカンダリ インデックスに配置された JET_TABLEIDが含まれています。

JET_errInvalidSesid

セッション ハンドルが無効であるか、閉じられたセッションを参照しています。

このエラーは、すべての状況で返されるわけではありません。 ハンドルはベスト エフォートベースでのみ検証されます。

JET_errNotInitialized

セッションに関連付けられているインスタンスが初期化されていないため、操作を完了できません。

JET_errOutOfCursors

エンジンが新しいカーソルを開くために必要なリソースを割り当てられなかったため、操作が失敗しました。 カーソル リソースは、paramid パラメーターで指定されたJET_paramMaxCursorsを使用して JetSetSystemParameter を呼び出すことによって構成されます。

JET_errOutOfMemory

完了するのに十分なメモリを割り当てられなかったため、操作が失敗しました。

ホスト プロセスのアドレス空間が断片化しすぎると、JetIntersectIndexes はJET_errOutOfMemoryを返すことができます。 一時テーブル マネージャーは、格納するデータの量に関係なく、作成されたすべての一時テーブルに対して常に 1 MB のアドレス空間チャンクを割り当てます。 JetIntersectIndexes は、rgindexrange パラメーターで指定されたJET_IndexRangeごとに 1 つの一時テーブルを作成し、JET_RECORDLISTの出力用に 1 つの一時テーブルを作成します。

JET_errRestoreInProgress

セッションに関連付けられているインスタンスで復元操作が進行中であるため、操作を完了できません。

JET_errSessionSharingViolation

複数のスレッドから同じセッションを同時に使用することは無効です。

Windows XP: この戻り値は Windows XP で導入されています。

JET_errTermInProgress

セッションに関連付けられているインスタンスがシャットダウンされているため、操作を完了できません。

JET_errTooManyOpenIndexes

エンジンがテーブルのインデックスをキャッシュするために必要なリソースを割り当てられなかったため、操作が失敗しました。 スキーマをキャッシュできるインデックスの数は、paramid パラメーターで指定されたJET_paramMaxOpenTablesを使用して JetSetSystemParameter を使用して構成されます。

JET_errTooManyOpenTables

エンジンがテーブルのスキーマをキャッシュするために必要なリソースを割り当てられなかったため、操作が失敗しました。 キャッシュできるスキーマを持つテーブルの数は、paramid パラメーターで指定されたJET_paramMaxOpenTablesを持つ JetSetSystemParameter を使用して構成されます。

JET_errTooManySorts

エンジンが一時テーブルの作成に必要なリソースを割り当てられなかったため、操作が失敗しました。 一時テーブル リソースは、paramid パラメーターで指定されたJET_paramMaxTemporaryTablesを使用して JetSetSystemParameter を使用して構成されます。

成功すると、各入力インデックス範囲の説明で表される条件に一致するレコードのブックマークを含む新しい一時テーブルが返されます。

失敗した場合、結果を含む一時テーブルは作成されません。 一時データベースの状態は変更される場合があります。 データベース エンジンによって使用されている通常のデータベースの状態は変更されません。 この関数に提供される JET_TABLEIDの現在位置を変更できます。

解説

JetIntersectIndexes を使用すると、そのテーブルに対するセカンダリ インデックスの観点から抽出条件を表すことができる場合に、複数の条件でテーブル内のレコードを効率的にフィルター処理できます。 たとえば、人を含む非常に大きなテーブルがあるとします。 テーブルには、ユーザー ID、名、姓などの列を含めることができます。 これらの各列のインデックスが個別に作成され、テーブルのプライマリ インデックスがユーザー ID を超えているとします。名が A で始まり、姓が G で始まるすべてのユーザーを検索する場合は、次の手順を実行します。

  1. テーブルの新しいカーソルを開き、"名" 列のインデックスを使用するようにそのカーソルを設定します。 次に、"名" が 'A' で始まるすべてのユーザーのインデックス範囲を設定し、このカーソルを含む JET_IndexRange 構造体を作成します。

  2. "姓" が "G" で始まったすべてのユーザーに対して、"姓" インデックスに新しいカーソルを置いて手順 1 を繰り返します。

  3. JetIntersectIndexes にこれらの条件を渡して、結果を一時テーブルに計算します。

  4. 一時テーブルを走査し、ブックマークによって条件を渡す各レコードを取得します。

結果セットを含む一時テーブルは、共通部分の計算に使用されるすべての条件を渡した各レコードのブックマークを含む 1 つの列を含む単純なテーブルです。 結果セットはプライマリ インデックスと同じ順序で並べ替えられますが、重複するエントリは含まれます。 アプリケーションは、一時テーブル内の行を列挙し、 JetRetrieveColumn を使用して各結果のブックマークを取得し、そのブックマークをプライマリ インデックス上に置かれたカーソルで JetGotoBookmark を呼び出してデータベース内のレコードにアクセスすることで、共通部分の結果を列挙できます。

JetIntersectIndexes によって返される一時テーブルは、前方方向でのみスキャンできます。 スキャンが完了したら、 JetCloseTable を使用して閉じる必要もあります。 一時テーブルとそのしくみの詳細については、「 JetOpenTemporaryTable」を参照してください。

JetIntersectIndexes は、通常、複数のインデックス付き条件に基づいてレコードをフィルター処理するための効率的で便利な方法です。 ただし、この機能の有用性を最大限に高めるために従う必要がある重要なヒントがいくつかあります。 抽出条件の 1 つが非常に制限され、結果のインデックス範囲に含まれるレコードが非常に少ないことがわかっている場合は、そのインデックス範囲を単純にウォークし、アプリケーション レベルでレコードをフィルター処理することをお勧めします。 さらに、交差の他の条件よりもはるかに制限の緩い条件があることがわかっている場合は、それらの制限の緩い条件を交差点から削除することを検討してください。 最後に、抽出条件の 1 つが、結果のインデックス範囲がプライマリ インデックスとほぼ同じ大きさになるように制限されていないことがわかっている場合は、そのインデックス範囲と交差すると、結果セットの利点 (のサイズを小さくする) 可能性は低くなります。 いずれの場合も、入力で可能な限り少ないインデックス エントリを取得し、出力で最も具体的なブックマークセットを生成してパフォーマンスを最大限に高める方法で条件を選択する必要があります。

必要条件

要件

Client

Windows Vista、Windows XP、または Windows 2000 Professional が必要です。

[サーバー]

Windows Server 2008、Windows Server 2003、または Windows 2000 Server が必要です。

Header

Esent.h で宣言されています。

Library

ESENT.lib を使用します。

[DLL]

ESENT.dllが必要です。

参照

JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JET_IndexRange
JET_RECORDLIST
JetGotoBookmark
JetRetrieveColumn
JetSetIndexRange