JetIntersectIndexes 函数

适用于: Windows |Windows Server

JetIntersectIndexes 函数

JetIntersectIndexes 函数计算同一表中不同辅助索引的多个索引项集之间的交集。 此操作可用于在表中查找与可以使用索引范围表示的两个或多个条件匹配的记录集。

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

parameters

sesid

用于此调用的会话。

rgindexrange

指向JET_IndexRange结构的数组 指针。 每个结构都包含一个 JET_TABLEID ,该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

无法完成操作,因为与会话关联的实例遇到严重错误,要求撤销对所有数据的访问权限以保护该数据的完整性。

Windowsxp: 此返回值是在 Windows XP 中引入的。

JET_errInvalidgrbit

请求的选项之一无效、未正确使用或未实现。

在以下情况下 ,JetIntersectIndexes 将返回此错误:

rgindexrange 数组中任何元素指向的 JET_IndexRange 结构中包含的 grbit 不等于 JET_bitRecordInIndex。

JET_errInvalidParameter

提供的其中一个参数包含意外值或与另一个参数的值组合时不一致的值。

JetIntersectIndexes 返回此错误的原因如下:

  • precordlist 参数为 NULL。

  • precordlist 参数中指定的 JET_RECORDLIST 结构的 cbStruct 成员不等于 JET_RECORDLIST 结构的大小。

  • cindexrange 参数为零。

  • cindexrange 参数大于 64。

  • rgindexrange 参数指定的数组中任何元素的 cbStruct 成员不等于 JET_IndexRange 结构的大小。

  • rgindexrange 数组中的元素包含来自不同表的 JET_TABLEID

  • rgindexrange 数组中的元素包含未定位在辅助索引上的JET_TABLEID

  • rgindexrange 数组中的一个或多个元素包含定位在同一辅助索引上的 JET_TABLEID

JET_errInvalidSesid

会话句柄无效或引用已关闭的会话。

并非所有情况下都返回此错误。 句柄仅在尽最大努力的基础上进行验证。

JET_errNotInitialized

无法完成操作,因为尚未初始化与会话关联的实例。

JET_errOutOfCursors

操作失败,因为引擎无法分配打开新游标所需的资源。 使用 paramid 参数中指定的JET_paramMaxCursors调用 JetSetSystemParameter 来配置游标资源。

JET_errOutOfMemory

操作失败,因为无法分配足够的内存来完成此操作。

如果主机进程的地址空间过于分散,JetIntersectIndexes 可以返回JET_errOutOfMemory。 无论要存储的数据量如何,临时表管理器始终都会为每个创建的临时表分配 1MB 的地址空间块。 JetIntersectIndexes 将为 rgindexrange 参数中指定的每个JET_IndexRange创建一个临时表,并为 JET_RECORDLIST 中的输出创建一个临时表。

JET_errRestoreInProgress

无法完成该操作,因为正在对与会话关联的实例执行还原操作。

JET_errSessionSharingViolation

同时从多个线程使用同一会话是非法的。

Windowsxp: 此返回值是在 Windows XP 中引入的。

JET_errTermInProgress

无法完成操作,因为正在关闭与会话关联的实例。

JET_errTooManyOpenIndexes

操作失败,因为引擎无法分配缓存表索引所需的资源。 可以使用 JetSetSystemParameter 配置架构可以缓存的索引数,并在 paramid 参数中指定的JET_paramMaxOpenTables

JET_errTooManyOpenTables

操作失败,因为引擎无法分配缓存表架构所需的资源。 可以使用 jetSetSystemParameter 配置架构的表数,该表的架构可以缓存, JET_paramMaxOpenTablesparamid 参数中指定的。

JET_errTooManySorts

操作失败,因为引擎无法分配创建临时表所需的资源。 临时表资源是使用 JetSetSystemParameter 配置的,JET_paramMaxTemporaryTables 在 paramid 参数中指定的。

成功后,将返回一个新的临时表,其中包含与每个输入索引范围说明所表示的条件匹配的记录的书签。

失败时,将不会创建包含结果的临时表。 临时数据库的状态可能会更改。 数据库引擎使用的任何普通数据库的状态将保持不变。 提供给此函数的 JET_TABLEID的当前位置可能会更改。

备注

JetIntersectIndexes 可用于按多个条件有效地筛选表中的记录,前提是这些条件可以用该表中的辅助索引来表示。 例如,假设你有一个非常大的表,其中包含人员。 该表可以包含其用户 ID、名字、姓氏等列。 假设每个列单独编制索引,并且表的主索引基于用户 ID。如果要查找名字以 A 开头、姓氏以 G 开头的每个人,请执行以下步骤:

  1. 打开表上的新游标,并将该游标设置为使用“名字”列上的索引。 然后,为“名字”以“A”开头的所有人员设置索引范围,并生成包含此游标 的JET_IndexRange 结构。

  2. 对于“姓氏”以“G”开头的所有人员,使用新的光标重复步骤 1。

  3. 将这些条件传递给 JetIntersectIndexes ,以将结果计算到临时表中。

  4. 遍历临时表,并按书签检索通过条件的每个记录。

包含结果集的临时表是一个包含一个列的简单表,其中包含传递用于计算交集的所有条件的每条记录的书签。 结果集的排序顺序与主索引相同,并且不包含重复条目。 应用程序可以通过枚举临时表中的行来枚举交集的结果,使用 JetRetrieveColumn 检索每个结果的书签,然后通过使用位于主索引上的游标上的书签调用 JetGotoBookmark 来访问数据库中的记录。

JetIntersectIndexes 返回的临时表只能向前扫描。 扫描完成后,还应通过 JetCloseTable 关闭它。 有关临时表及其工作原理的详细信息,请参阅 JetOpenTemporaryTable

JetIntersectIndexes 通常是基于多个索引条件筛选记录的高效便捷方法。 但是,为了最大程度地提高此功能的有用性,应遵循一些重要提示。 如果你知道其中一个条件非常严格,导致生成的索引范围记录很少,那么最好只是遍历该索引范围并在应用程序级别筛选记录。 此外,如果你知道你的条件比交集中的其他条件限制要小得多,则可以考虑从交集中删除这些限制性小得多的条件。 最后,如果知道其中一个条件完全没有限制,导致生成的索引范围几乎与主索引一样大,则与该索引范围相交不太可能有利于 (减小结果集) 大小。 在所有情况下,应选择条件的方式是,在输入时采用尽可能少的索引条目,并在输出上生成最具体的书签集,以获得最佳性能。

要求

要求

客户端

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

服务器

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

标头

在 Esent.h 中声明。

Library

使用 ESENT.lib。

DLL

需要ESENT.dll。

另请参阅

JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JET_IndexRange
JET_RECORDLIST
JetGotoBookmark
JetRetrieveColumn
JetSetIndexRange