JET_INDEXCREATE 構造体
適用対象: Windows |Windows Server
JET_INDEXCREATE構造体には、拡張可能記憶域エンジン (ESE) データベースのデータに対するインデックスを作成するために必要な情報が含まれています。 この構造体は、 JetCreateIndex2 などの関数や、 JET_TABLECREATEやJET_TABLECREATE2 などの構造体で使用 されます。
typedef struct tagJET_INDEXCREATE {
unsigned long cbStruct;
tchar* szIndexName;
tchar* szKey;
unsigned long cbKey;
JET_GRBIT grbit;
unsigned long ulDensity;
union {
unsigned long lcid;
JET_UNICODEINDEX* pidxunicode;
};
union {
unsigned long cbVarSegMac;
JET_TUPLELIMITS* ptuplelimits;
};
JET_CONDITIONALCOLUMN* rgconditionalcolumn;
unsigned long cConditionalColumn;
JET_ERR err;
unsigned long cbKeyMost;
} JET_INDEXCREATE;
メンバー
cbStruct
この構造体のサイズ (バイト単位)。 このメンバーを sizeof( JET_INDEXCREATE ) に設定します。
szIndexName
作成するインデックスの名前。
インデックスの名前は、次の条件を満たしている必要があります。
終端の null を含めず、JET_cbNameMost未満にする必要があります。
0 から 9、A から Z、a から z、および "!" を除く他のすべての句読点で構成されている必要があります。(感嘆符)、"、" (コンマ)、"[" (始め角かっこ)、"]" (右角かっこ) — つまり、ASCII 文字0x20、0x2d 0x22、0x5a、0x5c、0x5dから0x7fを0x2f。
スペースで始めてはなりません。
少なくとも 1 つの非スペース文字で構成されている必要があります。
szKey
null で区切られたトークンの二重 null で終わる文字列へのポインター。
各トークンは "<direction-specifier><column-name>" という形式で、direction-specification は "+" または "-" です。 たとえば、"+abc\0-def\0+ghi\0" の szKey では、3 つの列 "abc" (昇順)、"def" (降順)、"ghi" (昇順) のインデックスが作成されます。 C 言語では、文字列リテラルには暗黙的な NULL 終端記号があります。したがって、上記の文字列は double-NULL で終了します。
szKey で指定された列の数は、JET_ccolKeyMost (バージョンに依存する定数) の値を超えることはできません。
szKey では、少なくとも 1 つの列に名前を付ける必要があります。
古い動作: double-NULL 終端記号の後に、インデックスの LCID を指定する方法として、言語 ID (MAKELCID( langid, SORT_DEFAULT ) に渡される WORD) を指定できます。 szKey の言語 ID と JET_UNICODEINDEX の LCID の両方を指定することは無効です (grbit で JET_bitIndexUnicode を設定します)。
非推奨: 言語 ID の後に、 cbVarSegMac を USHORT として渡すことができます。 USHORT が szKey で設定されている場合と、 構造体に cbVarSegMac が設定されている場合、動作は未定義です。
cbKey
2 つの終端の null を含む szKey の長さ (バイト単位)。
grbit
次の表に示す 0 個以上の値を含むビットのグループ。
値 |
説明 |
---|---|
JET_bitIndexUnique |
重複するインデックス エントリ (キー) は使用できません。 これは、JetSetColumn が呼び出されたときではなく、JetUpdate が呼び出されたときに適用されます。 |
JET_bitIndexPrimary |
インデックスはプライマリ (クラスター化) インデックスです。 すべてのテーブルには、1 つのプライマリ インデックスが必要です。 テーブルに対してプライマリ インデックスが明示的に定義されていない場合、データベース エンジンは独自のプライマリ インデックスを作成します。 |
JET_bitIndexDisallowNull |
インデックスが作成される列に NULL 値を含めることもできます。 |
JET_bitIndexIgnoreNull |
インデックスが作成されているすべての列が NULL の場合は、行のインデックス エントリを追加しないでください。 |
JET_bitIndexIgnoreAnyNull |
インデックスが作成される列のいずれかが NULL の場合は、行のインデックス エントリを追加しないでください。 |
JET_bitIndexIgnoreFirstNull |
インデックスが作成される最初の列が NULL の場合は、行のインデックス エントリを追加しないでください。 |
JET_bitIndexLazyFlush |
インデックス操作は遅延ログに記録されます。 JET_bitIndexLazyFlushは、データ更新の怠け目には影響しません。 プロセスの終了によってインデックス作成操作が中断された場合でも、Soft Recovery はデータベースを一貫した状態にすることはできますが、インデックスが存在しない可能性があります。 |
JET_bitIndexEmpty |
すべてのエントリが NULL と評価されるため、インデックスの作成を試みないでください。 grbit では、JET_bitIndexEmptyが渡されるときにJET_bitIgnoreAnyNullも指定する必要があります。 これはパフォーマンスの向上です。 たとえば、新しい列がテーブルに追加されると、この新しく追加された列に対してインデックスが作成され、インデックスに追加されていない場合でも、テーブル内のすべてのレコードがスキャンされます。 JET_bitIndexEmptyを指定すると、テーブルのスキャンがスキップされ、時間がかかる可能性があります。 |
JET_bitIndexUnversioned |
インデックスの作成を他のトランザクションに表示します。 通常、トランザクション内のセッションでは、別のセッションでインデックス作成操作を確認できません。 このフラグは、別のトランザクションで同じインデックスが作成される可能性がある場合に便利です。 2 番目のインデックス作成は、多くの不要なデータベース操作を引き起こす可能性がある代わりに失敗します。 2 番目のトランザクションでは、インデックスをすぐに使用できない場合があります。 インデックスの作成操作は、使用できるようになる前に完了する必要があります。 バージョン情報のないインデックスを作成するために、セッションがトランザクション内に存在してはなりません。 |
JET_bitIndexSortNullsHigh |
このフラグを指定すると、インデックス内のすべての列のデータの後に NULL 値が並べ替えられます。 |
JET_bitIndexUnicode |
このフラグを指定すると、構造体内の lcid/pidxunicde 共用体フィールドの解釈に影響します。 ビットを設定すると、 pidxunicode フィールドは実際には JET_UNICODEINDEX 構造体を指します。 Unicode データのインデックスを作成するために、JET_bitIndexUnicodeは必要ありません。 Unicode データの正規化をカスタマイズするためにのみ使用されます。 |
JET_bitIndexTuples |
インデックスがタプル インデックスであることを指定します。 タプル インデックスの説明については、「 JET_TUPLELIMITS 」を参照してください。 JET_bitIndexTuplesは、Windows XP オペレーティング システムで導入されました。 |
JET_bitIndexTupleLimits |
このフラグを指定すると、構造体内の cbVarSegMac/ptuplelimits 共用体フィールドの解釈に影響します。 このビットを設定すると、 ptuplelimits フィールドは実際には JET_TUPLELIMITS 構造体を指し、カスタムタプルインデックスの制限を許可することを意味します (JET_bitIndexTuplesを意味します)。 JET_bitIndexTupleLimitsは、Windows Server 2003 オペレーティング システムで導入されました。 |
JET_bitIndexCrossProduct 0x00004000 |
複数値の列である複数のキー列を持つインデックスに対してこのフラグを指定すると、これらのキー列内のすべての値のクロス積の結果ごとにインデックス エントリが作成されます。 それ以外の場合、インデックスは、複数値列である最も重要なキー列の複数値ごとに 1 つのエントリのみを持ち、これらの各インデックス エントリは、複数値列である他のキー列の最初の複数値を使用します。 たとえば、値が "red" と "blue" の列 B の値が "1" および "2" である列 A のインデックスに対してこのフラグを指定した場合、"red"、"1" のインデックス エントリが作成されます。"red", "2";"blue", "1";"blue"、"2" それ以外の場合は、次のインデックス エントリが作成されます: "red"、"1"。"blue"、"1" JET_bitIndexCrossProductは、Windows Vista オペレーティング システムで導入されました。 |
JET_bitIndexKeyMost 0x00008000 |
このフラグを指定すると、インデックスは 構造体の cbKeyMost フィールドで指定された最大キー サイズを使用します。 それ以外の場合、インデックスは最大キー サイズとして JET_cbKeyMost (255) を使用します。 JET_bitIndexKeyMostは Windows Vista で導入されました。 |
JET_bitIndexDisallowTruncation 0x00010000 |
このフラグを指定すると、インデックスを更新すると、切り捨てられたキーがJET_errKeyTruncatedで失敗します。 それ以外の場合、キーは自動的に切り捨てられます。 キーの切り捨ての詳細については、 JetMakeKey 関数を参照してください。 Windows Vista: JET_bitIndexDisallowTruncation は Windows Vista で導入されています。 |
JET_bitIndexNestedTable 0x00020000 |
このフラグを指定すると、複数の複数値の列に対してインデックスが更新されますが、同じ itagSequence の値でのみ更新されます。 JET_bitIndexNestedTableは Windows Vista で導入されました。 |
ulDensity
初期インデックス B+ ツリーのパーセンテージ密度。 100 未満の数値を指定すると、インデックスを最初に作成するためにより多くの領域が使用されますが、インデックスの将来の拡張が可能になるため、内部の断片化を回避できます。
lcid
grbit パラメーターでJET_bitIndexUnicode値が指定されていない場合にデータを正規化するときに使用するロケール識別子 (LCID)。 インデックスが Unicode 列を超える場合、LCID は正規化に影響します。
pidxunicode
grbit パラメーターにJET_bitIndexUnicode値が指定されている場合は、JET_UNICODEINDEX構造体へのポインター。 これにより、ユーザーは Unicode 正規化時に LCMapString 関数に渡されるカスタム フラグを指定できます。
cbVarSegMac
grbit パラメーターでJET_bitIndexTupleLimits値が指定されていない場合にインデックスに格納する各列の最大長 (バイト単位)。
このフィールドに 0 (ゼロ) の値を指定すると、次のようになります。
プライマリ インデックスのJET_cbPrimaryKeyMostを指定する。
セカンダリ インデックスのJET_cbSecondaryKeyMostの指定。
ptuplelimits
grbit パラメーターでJET_bitIndexTupleLimits値が指定されている場合は、JET_TUPLELIMITS構造体へのポインター。
ptuplelimits は Windows Server 2003 で導入されました。
rgconditionalcolumn
インデックス内の条件付き列を指定するために使用される、 JET_CONDITIONALCOLUMN 構造体の配列に対する省略可能なパラメーター。
cConditionalColumn
rgconditionalcolumn 配列内の構造体の数。
err
このインデックスを作成するためのリターン コードを格納します。
cbKeyMost
インデックス内のキーに許容される最大サイズをバイト単位で指定します。 grbit パラメーターにJET_bitIndexKeyMost値が指定されていない場合、このパラメーターは無視されます。 このパラメーターが 0 に設定され、 grbit パラメーターにJET_bitIndexKeyMostが指定されている場合、呼び出し元の関数は JET_err_InvalidDef で失敗します。
サポートされている最小最大キー サイズは、従来の最大キー サイズである JET_cbKeyMostMin (255) です。
最大キー サイズは、次のようにデータベース ページ サイズ (JET_paramDatabasePageSize) によって異なります。
JET_paramDatabasePageSize = 2048 の場合、JET_cbKeyMostMin (255) <= cbKeyMost<= JET_cbKeyMost2KBytePage (500)
JET_paramDatabasePageSize = 4096 の場合、JET_cbKeyMostMin (255) <= cbKeyMost<= JET_cbKeyMost4KBytePage (1000)
JET_paramDatabasePageSize = 8192 の場合、JET_cbKeyMostMin (255) <= cbKeyMost<= JET_cbKeyMost8KBytePage (2000)
インスタンスでサポートされている最大キー サイズは、JET_paramKeyMost システム パラメーターから読み取ることもできます。
cbKeyMost は Windows Vista で導入されました。
解説
ESE では、複数の値を含むキー列に対するインデックス作成がサポートされています。 この機能を使用するには、列がタグ付き列の種類 (JET_bitColumnTagged) である必要があり、複数の値にJET_bitColumnMultiValuedでインデックスが付けられるようにフラグを設定する必要があります。 Windows Vista より前のバージョンの Windows では、インデックス内の最初の複数値キー列の値のみがインデックスに展開されます。 他のすべての複数値列とタグ付き列では、最初の値のみがインデックスに展開されます。
次の行がテーブルに存在する場合 (列 Alpha は複数値ではなく、列 Beta、Gamma、Delta は複数値です)、インデックスは "+Alpha\0+Beta\0+Gamma\0+Delta\0\0" として作成されます。
[アルファ] |
ベータ |
Gamma |
差分 |
---|---|---|---|
1 |
ABC |
MNO |
VWX |
2 |
THE |
雨 |
IN |
立ち下がっているインデックスタプルが格納されます。
{1,ABC,MNO,VWX}
{1,GHI,MNO,VWX}
{1,JKL,MNO,VWX}
{2,THE,RAIN,IN}
{2,THE,SPAIN,IN} は格納されません。2 行目の Alpha 列に単一の複数値が含まれている場合でも、この値は格納されません。
Windows Vista 以降のバージョンの Windows では、JET_bitIndexCrossProductを指定することで、複数値を持つすべての列をインデックス内で展開できます。
要件
要件 | 値 |
---|---|
Client |
Windows Vista、Windows XP、または Windows 2000 Professional が必要です。 |
[サーバー] |
Windows Server 2008、Windows Server 2003、または Windows 2000 Server が必要です。 |
Header |
Esent.h で宣言されています。 |
Unicode |
JET_ INDEXCREATE_W (Unicode) および JET_ INDEXCREATE_A (ANSI) として実装されます。 |
関連項目
JET_COLTYP
JET_CONDITIONALCOLUMN
JET_ERR
JET_GRBIT
JET_TABLECREATE
JET_TABLECREATE2
JET_TUPLELIMITS
JET_UNICODEINDEX
JetCreateIndex2
JetSetColumn
JetUpdate