JetOpenTempTable 関数
適用対象: Windows |Windows Server
JetOpenTempTable 関数
JetOpenTempTable 関数は、1 つのインデックスを持つ一時テーブルを作成します。 一時テーブルは、 JetCreateTableColumnIndex を使用して作成された通常のテーブルと同様に、レコードを格納および取得します。 ただし、一時テーブルは揮発性のため、通常のテーブルよりもはるかに高速です。 また、純粋にシーケンシャルな方法でアクセスした場合に、レコード セットを非常に迅速に並べ替えて重複除去を実行するためにも使用できます。
JET_ERR JET_API JetOpenTempTable(
__in JET_SESID sesid,
__in const JET_COLUMNDEF* prgcolumndef,
__in unsigned long ccolumn,
__in JET_GRBIT grbit,
__out JET_TABLEID* ptableid,
__out JET_COLUMNID* prgcolumnid
);
パラメーター
sesid
使用するセッション。
prgcolumndef
一時テーブルに作成された列の列定義。
一時テーブルで使用される列定義オプションには、重要な制限があります。 詳細については、次の「解説」を参照してください。
通常の列定義オプションに加えて、一時テーブルのコンテキストにのみ関連する次のオプションを 0 個以上指定することもできます。
値 |
説明 |
---|---|
JET_bitColumnTTDescending |
一時テーブルのキー列の並べ替え順序は、昇順ではなく降順にする必要があります。 JET_bitColumnTTKeyを指定せずにこのオプションを指定した場合、このオプションは無視されます。 |
JET_bitColumnTTKey |
列は一時テーブルのキー列になります。 入力配列でこのオプションを指定した列定義の順序によって、一時テーブルの各キー列の優先順位が決まります。 このオプションが設定されている配列内の最初の列定義は、最も重要なキー列になります。 データベース エンジンでサポートできるキー列よりも多くのキー列が要求された場合、サポートされていないキー列ではこのオプションは無視されます。 |
ccolumn
「prgcolumndef」を参照してください。
grbit
次のオプションの 0 個以上を指定するビットのグループ。
値 |
説明 |
---|---|
JET_bitTTErrorOnDuplicateInsertion |
以前に挿入したレコードと同じインデックス キーを持つレコードを挿入しようとすると、JET_errKeyDuplicateですぐに失敗します。 このオプションが要求されていない場合は、要求された機能に基づいてデータベース エンジンが一時テーブルを実装するために選択した戦略に応じて、重複がすぐに検出され、失敗するか、後で自動的に削除されます。 この機能が必要ない場合は、要求しないことをお勧めします。 この機能が要求されない場合、一時テーブル マネージャーは、パフォーマンスの向上につながる一時テーブルを管理するための戦略を選択できる可能性があります。 |
JET_bitTTForceMaterialization |
一時テーブル マネージャーは、パフォーマンスが向上する一時テーブルの管理を使用するための最適な戦略の検索を中止するように強制します。 |
JET_bitTTForwardOnly |
一時テーブルは、一時テーブル マネージャーが中間クエリ結果用に最適化された実装を使用できる場合にのみ作成されます。 一時テーブルの特性によってこの最適化の使用が妨げる場合、操作はJET_errCannotMaterializeForwardOnlySortで失敗します。 このオプションの副作用は、一時テーブルに重複するインデックス キーを持つレコードを含めることができるようにすることです。 詳細については、「JET_bitTTUnique」を参照してください。 このオプションは、Windows Server 2003 以降のリリースでのみ使用できます。 |
JET_bitTTIndexed |
このオプションは、 JetSeek を使用してインデックス キーでレコードを検索できるように、一時テーブルの柔軟性を要求します。 この機能が必要ない場合は、要求しないことをお勧めします。 この機能が要求されない場合、一時テーブル マネージャーは、パフォーマンスの向上につながる一時テーブルを管理するための戦略を選択できる可能性があります。 |
JET_bitTTUnique |
重複するインデックス キーを持つレコードを、一時テーブルの最後のレコード セットから削除する要求。 Windows Server 2003 より前のバージョンでは、すべてのクラスター化インデックスも主キーである必要があり、したがって一意である必要があるため、データベース エンジンでは常にこのオプションが有効であると想定しました。 Windows Server 2003 の時点で、JET_bitTTForwardOnly オプションも指定されている場合に重複を削除しない一時テーブルを作成できるようになりました。 一般に、どの重複が成功し、どの重複が破棄されるかを知ることはできません。 ただし、JET_bitTTErrorOnDuplicateInsertion オプションが要求されると、一時テーブルに挿入する特定のインデックス キーを持つ最初のレコードは常に成功します。 |
JET_bitTTUpdatable |
以前に挿入されたレコードを後で変更できるように、一時テーブルに十分な柔軟性を持たせるように要求します。 この機能が必要ない場合は、要求しないことをお勧めします。 この機能が要求されない場合、一時テーブル マネージャーは、パフォーマンスの向上につながる一時テーブルを管理するための戦略を選択できる可能性があります。 |
JET_bitTTScrollable |
JetMove を使用してレコードを任意の順序および方向でスキャンできるように、一時テーブルの柔軟性を確保するように要求します。 この機能が必要ない場合は、要求しないことをお勧めします。 この機能が要求されない場合、一時テーブル マネージャーは、パフォーマンスの向上につながる一時テーブルを管理するための戦略を選択できる可能性があります。 |
JET_bitTTSortNullsHigh |
NULL キー列の値が NULL 以外のキー列値よりもインデックスの末尾に近い位置に並べ替えられるよう要求します。 |
JET_bitTTIntrinsicLVsOnly |
組み込みの長い値のみを許可するように要求します。 Windows 7: JET_bitTTIntrinsicLVsOnly は Windows 7 で導入されています。 |
ptableid
新しく作成された一時テーブルで開かれた新しいカーソルを受け取る出力バッファー。
prgcolumnid
一時テーブルの作成時に生成された列 ID の配列を受け取る出力バッファー。
この配列の列 ID は、列定義の入力配列に正確に対応します。 その結果、このバッファーのサイズは入力配列のサイズに対応している必要があります。
戻り値
この関数は、次のいずれかのリターン コードを使用して 、JET_ERR データ型を返します。 考えられる ESE エラーの詳細については、「 拡張可能ストレージ エンジン エラー 」および「 エラー処理パラメーター」を参照してください。
リターン コード |
説明 |
---|---|
JET_errSuccess |
操作は正常に完了しました。 |
JET_errCannotMaterializeForwardOnlySort |
jetOpenTempTable は、JET_bitTTForwardOnlyが指定されており、指定された一時テーブルを前方専用最適化を使用して作成できなかったため、失敗しました。 このエラーは、Windows Server 2003 以降のリリースでのみ返されます。 |
JET_errClientRequestToStopJetService |
JetStopService の呼び出しの結果、セッションに関連付けられたインスタンス上のすべてのアクティビティが停止したため、操作を完了することはできません。 |
JET_errIndexInvalidDef |
無効なインデックス定義が指定されたため、インデックスを作成できませんでした。 JetOpenTempTable は、次の場合にこのエラーを返します。
このエラーは Windows 2000 によってのみ返されます。 |
JET_errInstanceUnavailable |
セッションに関連付けられているインスタンスで致命的なエラーが発生したため、操作を完了できません。このエラーでは、そのデータの整合性を保護するためにすべてのデータへのアクセスを取り消す必要があります。 このエラーは、Windows XP 以降のリリースでのみ返されます。 |
JET_errInvalidCodePage |
JET_COLUMNDEFの cp フィールドが有効なコード ページに設定されていません。 テキスト列の有効な値は、英語 (1252) と Unicode (1200) のみです。 値 0 は、既定値が使用されることを意味します (英語、1252)。 |
JET_errInvalidColumnType |
JET_COLUMNDEFの coltyp フィールドが有効な列型に設定されていません。 |
JET_errInvalidLanguageId |
無効なロケール ID を使用しようとしたため、インデックスを作成できませんでした。 ロケール ID が完全に無効であるか、関連付けられている言語パックがインストールされていない可能性があります。 |
JET_errInvalidLCMapStringFlags |
無効な正規化フラグのセットを使用しようとしたため、インデックスを作成できませんでした。 このエラーは、Windows XP 以降のリリースでのみ返されます。 Windows 2000 では、無効な正規化フラグが代わりにJET_errIndexInvalidDefされます。 |
JET_errInvalidSesid |
セッション ハンドルが無効であるか、閉じられたセッションを参照しています。 メモ このエラーは、すべての状況で返されるわけではありません。 ハンドルはベスト エフォートベースでのみ検証されます。 |
JET_errNotInitialized |
セッションに関連付けられているインスタンスがまだ初期化されていないため、操作を完了できません。 |
JET_errOutOfCursors |
エンジンが新しいカーソルを開くために必要なリソースを割り当てることができないため、操作が失敗しました。 カーソル リソースは、JET_paramMaxCursorsで JetSetSystemParameter を使用して構成されます。 |
JET_errOutOfMemory |
完了するのに十分なメモリを割り当てられなかったため、操作が失敗しました。 JetOpenTempTable は、ホスト プロセスのアドレス空間が断片化しすぎると、JET_errOutOfMemoryを返すことができます。 一時テーブル マネージャーは、格納するデータの量に関係なく、作成されたすべての一時テーブルに対して常に 1 MB のアドレス空間チャンクを割り当てます。 |
JET_errRestoreInProgress |
セッションに関連付けられているインスタンスで復元操作が進行中であるため、操作を完了できません。 |
JET_errSessionSharingViolation |
同じセッションを複数のスレッドに同時に使用することはできません。 このエラーは、Windows XP 以降のリリースでのみ返されます。 |
JET_errTermInProgress |
セッションに関連付けられているインスタンスがシャットダウンされているため、操作を完了できません。 |
JET_errTooManyColumns |
テーブルに列を追加しようとしました。 テーブルには、固定列JET_ccolFixedMost以下、可変長列JET_ccolVarMost、およびタグ付き列JET_ccolTaggedMost以下を含めることができます。 |
JET_errTooManyOpenIndexes |
エンジンがテーブルのインデックスをキャッシュするために必要なリソースを割り当てることができないため、操作が失敗しました。 キャッシュできるスキーマを持つインデックスの数は、 jetSetSystemParameter と JET_paramMaxOpenTables を使用して構成されます。 |
JET_errTooManyOpenTables |
エンジンがテーブルのスキーマをキャッシュするために必要なリソースを割り当てることができないため、操作が失敗しました。 キャッシュできるスキーマを持つテーブルの数は、 jetSetSystemParameter と JET_paramMaxOpenTables を使用して構成されます。 |
JET_errTooManySorts |
エンジンが一時テーブルの作成に必要なリソースを割り当てることができないため、操作は失敗しました。 一時テーブル リソースは、 JetSetSystemParameter と JET_paramMaxTemporaryTablesを使用して構成されます。 |
成功すると、新しく作成された一時テーブルで開かれたカーソルが返されます。 一時データベースの状態は、新しい一時テーブルを格納するように準備されます。 データベース エンジンによって使用されている通常のデータベースの状態は変更されません。
失敗した場合、一時テーブルは作成されず、カーソルは返されません。 一時データベースの状態は変更される場合があります。 データベース エンジンによって使用されている通常のデータベースの状態は変更されません。
解説
一時テーブルでは、通常データベース エンジンでサポートされている列定義オプションの完全な補完はサポートされていません。 実際には、JET_bitColumnFixedとJET_bitColumnTaggedのみがサポートされています。 つまり、一時テーブルに自動インクリメント、バージョン、または複数値の列を作成することはできません。 最後に、エスクロー更新列は、一度に 1 つのセッションでのみ使用できるため、一時テーブルでは役に立たないため、サポートされていません。 これらのオプションのいずれかが要求された場合、それらは無視されます。
一時テーブルでは既定値はサポートされていません。 既定値の指定を含む列定義が指定されている場合、その指定は無視されます。
一時テーブルは、さまざまな ESE 関数の結果として呼び出し元に返されます。 たとえば、InfoLevel パラメーターに JET_IdxInfo オプションを設定した JetGetIndexInfo は、特定のインデックス内のすべてのキー列のリストを含む一時テーブルを返します。 一時テーブルは、ここで説明する通常の一時テーブルと同じライフサイクル ルールに従います。
一時テーブルは、多くのタスクに対してデータベース エンジンによって内部的に使用されます。 これらのタスクの中で最も重要なのは、既存のテーブルに対するインデックスの作成です。 一時テーブルは、そのインデックスの作成に使用されるインデックス キーの並べ替えに使用されます。
すべての一時テーブルは一時データベースに格納されます。 一時データベースは、ESE インスタンスの有効期間中に保持され、そのインスタンスがシャットダウンまたは再起動されると削除される特殊なデータベース ファイルです。 一時データベースの場所は、 JetSetSystemParameter と JET_paramTempPathを使用して構成できます。 アプリケーションで一時テーブルを頻繁に使用したり、インデックスを頻繁に作成したりする場合は、トランザクション ログ ファイルとデータベース ファイルに対する一時データベースのディスクへの配置が重要な場合があります。
一時テーブルのライフサイクルは、一時テーブルを参照するカーソルに関連付けられます。 一時テーブルを参照するすべてのカーソルが暗黙的または明示的に閉じられている場合、一時テーブルは削除されます。 一時テーブルがトランザクション内に作成され、その後そのトランザクションがロールバックされた場合、この時点で一時テーブルを参照していたカーソルは暗黙的に閉じられるため、一時テーブルは削除されます。 新しいカーソルは、 JetDupCursor を使用する場合にのみ一時テーブルを参照できます。 この場合、新しいカーソルは一時テーブルの最初のインデックス エントリに配置されます。 JetDupCursor は、一時テーブルの特定の使用フェーズでのみ機能します。 詳細については、一時テーブル・カーソル機能に関する解説を参照してください。 一度に複数のセッションから一時テーブルを参照することはできません。
JetDupCursor には、一時テーブルに影響する重要な問題があります。 前方専用モードの一時テーブルを複製しようとすると、結果のカーソルは正しく作成されず、誤動作します。 具体化された一時テーブルの上にカーソルを複製しても安全です。
一時テーブル マネージャーは、3 つの方法で一時テーブルを実装することを選択できます。 1 つ目の方法は、メモリ内テーブルを維持することです。 この方法は最も高速ですが、小規模で単純な一時テーブルにのみ使用できます。 2 つ目の方法は、前方スクロール反復子を使用して駆動できるディスク ベースの並べ替えを作成することです。 この方法は特定の状況でのみ使用でき、非常に大きなデータ セットの重複を並べ替えて削除する最も速い方法です。 3 番目の方法は、一時テーブルを保持する B+ ツリーを一時データベースに作成することです。 この戦略は最も遅いですが、最も汎用性が高く、具体化された一時テーブルと呼ばれます。 これらの戦略は、最終的に一時テーブルに要求された機能を実現するために組み合わせて使用できます。
一時テーブルが具体化されていない場合は、主に 2 つの主要なフェーズで使用されます。 最初のフェーズは、テーブルに初期データ セットが設定される挿入フェーズです。 このフェーズでは、データの挿入のみが許可されます。 このフェーズは、 JetMove または JetSeek を使用してカーソルを移動しようとすると終了します。 2 番目のフェーズは、データ抽出フェーズです。 このフェーズでは、一時テーブルの作成時に要求された機能に従って、一時テーブルに格納されたデータを抽出できます。
一時テーブル カーソル機能
一時テーブルが具体化されると、カーソルには次の機能がありますが、要求されたオプションによってさらに制限される場合があります。
一時テーブルが具体化されず、挿入フェーズにある場合、カーソルには次の機能がありますが、要求されたオプションによってさらに制限される場合があります。
-
メモ 抽出フェーズに移行します。
-
メモ 抽出フェーズに移行します。
一時テーブルが具体化されず、抽出フェーズにある場合、カーソルには次の機能がありますが、要求されたオプションによってさらに制限される場合があります。
-
メモ 前方専用モードの一時テーブルを複製しようとすると、結果のカーソルは正しく作成されず、誤動作します。 具体化された一時テーブルの上にカーソルを複製しても問題ありません。
必要条件
要件 | 値 |
---|---|
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_COLUMNDEF
JET_COLUMNID
JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JET_UNICODEINDEX
JetCloseTable
JetCreateTableColumnIndex
JetDupCursor
JetMove
JetRollback
JetSeek
JetSetSystemParameter
一時データベース パラメーター