JET_INDEXCREATE2 结构

适用于: Windows |Windows Server

JET_INDEXCREATE2 结构包含基于可扩展存储引擎 (ESE) 数据库中的数据创建索引所需的信息。 结构由 JetCreateIndex2 等函数以及 JET_TABLECREATEJET_TABLECREATE2 等结构使用。

windows 7 操作系统中引入了 JET_INDEXCREATE2 结构。

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

要创建的索引的名称。

该名称应满足以下条件:

  • 它应小于 JET_cbNameMost,不包括终止 null。

  • 它必须包含以下一组字符:0 (零) 到 9,A 到 Z,a 到 z, 以及除“!” (感叹号) 、“、” (逗号) “、”[“ (左括号) 和”]“ (右括号) (标点,即 ASCII 字符0x20、0x22 0x2d、0x2f 0x5a、0x5c和0x5d 0x7f。

  • 它不得以空格开头。

  • 它必须至少包含一个非空格字符。

szKey

指向以 null 分隔的标记的双 null 终止字符串的指针。

每个标记的格式为“<direction-specifier><column-name>”,其中 direction-specification 为“+”或“-”。 例如,“+abc\0-def\0+ghi\0” 的 szKey 将按升序) (三列“abc”编制索引,“def” (以降序) () 。 在 C 语言中,字符串文本具有隐含 的 NULL 终止符,因此上述字符串将以双 NULL 终止。

szKey 中指定的列数不能超过JET_ccolKeyMost (依赖于版本的常量) 。

szKey 中必须至少命名一个列。

过时行为:在双 NULL 终止符之后,可以 (WORD 指定语言 ID,该语言 ID 将传递到 MAKELCID ( langid,SORT_DEFAULT ) ) 作为指定索引 LCID 的一种方式。 通过在 grbit) 中设置JET_bitIndexUnicode,在 JET_UNICODEINDEX (中同时指定 szKey 中的语言 ID 和 LCID 是非法的。

已弃用:在语言 ID 之后,可以将 cbVarSegMac 作为 USHORT 数据类型传递。 如果在 szKey 中设置了 USHORT,如果在结构中设置了 cbVarSegMac ,则行为是未定义的。

cbKey

szKey 的长度(以字节为单位),包括两个终止 null。

grbit

包含下表中列出的零个或多个值选项的一组位。

含义

JET_bitIndexUnique

不允许重复索引条目 (键) 。 这在调用 JetUpdate 时强制执行,而不是在调用 JetSetColumn 时强制执行。

JET_bitIndexPrimary

索引是聚集) 索引的主要 (。 每个表必须恰好有一个主索引。 如果未对表显式定义主索引,则数据库引擎将创建自己的主索引。

JET_bitIndexDisallowNull

创建索引的列都不能包含 NULL 值。

JET_bitIndexIgnoreNull

如果索引的所有列均为 NULL,则不要为行添加索引项。

JET_bitIndexIgnoreAnyNull

如果索引的任何列为 NULL,请不要为行添加索引项。

JET_bitIndexIgnoreFirstNull

如果索引的第一列为 NULL,请不要为行添加索引项。

JET_bitIndexLazyFlush

指定将延迟记录索引操作。

JET_bitIndexLazyFlush不会影响数据更新的懒惰性。 如果索引操作因进程终止而中断,软恢复仍能够使数据库处于一致状态,但索引可能不存在。

JET_bitIndexEmpty

请勿尝试生成索引,因为所有条目的计算结果都将为 NULLgrbit 传递JET_bitIndexEmpty时,还必须指定JET_bitIgnoreAnyNull。 这是一种性能增强。 例如,如果将新列添加到表中,然后针对此新添加的列创建索引,则即使这些记录未添加到索引中,也会扫描表中的所有记录。 指定JET_bitIndexEmpty会跳过表的扫描,这可能会花费很长时间。

JET_bitIndexUnversioned

JET_bitIndexUnversioned会导致索引创建对其他事务可见。 通常,事务中的会话将无法在另一个会话中看到索引创建操作。 如果另一个事务可能创建相同的索引,则此标志非常有用。 第二个索引创建只是失败,而不是可能导致许多不必要的数据库操作。 第二个事务可能无法立即使用该索引。 索引创建操作必须先完成,然后它才可用。 会话当前不得位于事务中,无法创建没有版本信息的索引。

JET_bitIndexSortNullsHigh

指定此标志会使 NULL 值在索引中所有列的数据之后排序。

JET_bitIndexUnicode

指定此标志会影响结构中 lcid/pidxunicde 联合字段的解释。 设置位意味着 pidxunicode 字段实际上指向 JET_UNICODEINDEX 结构。 JET_bitIndexUnicode不需要为 Unicode 数据编制索引。 只需自定义 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

为具有多个键列(多值列)的索引指定此标志将导致为这些键列中所有值的交叉乘积的每个结果创建索引条目。 否则,索引对于作为多值列的最重要键列中的每个多值只有一个条目,并且每个索引项都将使用属于多值列的任何其他键列的第一个多值。

例如,如果为具有值“red”和“blue”的列 A 上的索引指定了此标志,而列 B 上具有值“1”和“2”,则会创建以下索引条目:“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

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,则忽略此参数。 如果此参数设置为零,并在 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”:

Alpha

Beta

Gamma

增量

1

ABC
GHI
JKL

MNO
PQR
斯图

VWX
YZ

2

THE


西班牙

IN
瀑布

将存储以下索引元组:

{1,ABC,MNO,VWX}
{1,GHI,MNO,VWX}
{1,JKL,MNO,VWX}
{2,THE,RAIN,IN}

请注意,{2,THE,SPAIN,IN}不会存储,即使第二行中的 Alpha 列恰好具有单个多值。

在从 Windows Vista 开始的 Windows 版本中,可以通过指定JET_bitIndexCrossProduct在索引中扩展所有多值列。

要求

要求

客户端

需要 Windows Vista、Windows XP 或 Windows 2000 Professional。

服务器

需要 Windows Server 2008、Windows Server 2003 或 Windows 2000 Server。

标头

在 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