JET_INDEXCREATE2 構造体
適用対象: Windows |Windows Server
JET_INDEXCREATE2構造体には、拡張可能記憶域エンジン (ESE) データベース内のデータに対するインデックスを作成するために必要な情報が含まれています。 この構造体は、 JetCreateIndex2 などの関数や、 JET_TABLECREATEやJET_TABLECREATE2 などの構造体で使用 されます。
JET_INDEXCREATE2構造は、Windows 7 オペレーティング システムで導入されました。
typedef struct tagJET_INDEXCREATE2 {
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_SPACEHINTS* pSpacehints;
} JET_INDEXCREATE;
メンバー
cbStruct
この構造体のサイズ (バイト単位)。 このメンバーを sizeof( JET_INDEXCREATE2 ) に設定します。
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 |
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 |
複数値の列である複数のキー列を持つインデックスに対してこのフラグを指定すると、これらのキー列内のすべての値のクロス積の結果ごとにインデックス エントリが作成されます。 それ以外の場合、インデックスは、複数値列である最も重要なキー列の複数値ごとに 1 つのエントリのみを持ち、これらの各インデックス エントリは、複数値列である他のキー列の最初の複数値を使用します。 たとえば、値が "1" と "2" の列 B の値が "red" および "blue" の列 A のインデックスに対してこのフラグを指定した場合、"red"、"1" のインデックス エントリが作成されます。"red", "2";"blue", "1";"blue"、"2" それ以外の場合は、次のインデックス エントリが作成されます: "red"、"1"。"blue"、"1" JET_bitIndexCrossProduct値は Windows Vista で導入されました。 |
JET_bitIndexKeyMost |
このフラグを指定すると、インデックスは 構造体の cbKeyMost フィールドで指定された最大キー サイズを使用します。 それ以外の場合、インデックスは最大キー サイズとして JET_cbKeyMost (255) を使用します。 JET_bitIndexKeyMost値は Windows Vista で導入されました。 |
JET_bitIndexDisallowTruncation |
このフラグを指定すると、インデックスを更新すると、JET_errKeyTruncated応答コードで切り捨てられたキーが失敗します。 それ以外の場合、キーは自動的に切り捨てられます。 キーの切り捨ての詳細については、「 JetMakeKey」を参照してください。 JET_bitIndexDisallowTruncation値は 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 で導入されました。
pSpacehints
JET_SPACEHINTS構造体へのポインター。
pSpacehints は Windows 7 で導入されました。
解説
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 行目の Alpha 列の複数値が 1 つであっても、{2,THE,SPAIN,IN} は格納されないことに注意してください。
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_ INDEXCREATE2_W (Unicode) およびJET_ INDEXCREATE2_A (ANSI) として実装されます。 |
関連項目
JET_COLTYP
JET_CONDITIONALCOLUMN
JET_ERR
JET_GRBIT
JET_TABLECREATE
JET_TABLECREATE2
JET_TUPLELIMITS
JET_UNICODEINDEX
JetCreateIndex2
JetSetColumn
JetUpdate