Поделиться через


Функция 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
    );

Параметры

sesid

Сеанс, используемый для этого вызова.

rgindexrange

Указатель на массив JET_IndexRange структур. Каждая структура включает в себя JET_TABLEID , которая была настроена для хранения одного из диапазонов индексов для пересечения. Дополнительные сведения см. в разделе JET_IndexRange.

cindexrange

Количество JET_IndexRange структур в массиве, содержавшемся в параметре rgindexrange .

precordlist

Указатель на структуру JET_RECORDLIST . Эта структура будет заполнена достаточной информацией для обхода временной таблицы с результатами JetIntersectIndexes.

Выходной буфер, получающий структуру JET_RECORDLIST . Структура содержит описание результирующий набор пересечения.

grbit

Зарезервировано для последующего использования.

Возвращаемое значение

Эта функция возвращает тип данных JET_ERR с одним из следующих кодов возврата. Дополнительные сведения об ошибках ESE см. в разделах Ошибки подсистемы расширяемого хранилища и Параметры обработки ошибок.

Код возврата

Описание

JET_errSuccess

Операция выполнена успешно.

JET_errClientRequestToStopJetService

Невозможно выполнить операцию, так как все действия экземпляра, связанного с сеансом, прекратились в результате вызова JetStopService.

JET_errInstanceUnavailable

Невозможно выполнить операцию, так как экземпляр, связанный с сеансом, столкнулся с неустранимой ошибкой, требующей отмены доступа ко всем данным для защиты целостности этих данных.

Windows XP: Это возвращаемое значение появилось в Windows XP.

JET_errInvalidgrbit

Один из запрошенных вариантов был недопустимым, использовался неправильно или не реализован.

Эта ошибка возвращается JetIntersectIndexes , когда:

Гбит, содержащийся в структуре JET_IndexRange, на которую указывает любой элемент в массиве rgindexrange, не равен JET_bitRecordInIndex.

JET_errInvalidParameter

Один из предоставленных параметров содержит непредвиденное или несогласованное значение при сочетании со значением другого параметра.

Эта ошибка возвращается JetIntersectIndexes по следующим причинам:

  • Параметр precordlist имеет значение NULL.

  • Член cbStruct структуры JET_RECORDLIST , указанной в параметре precordlist , не равен размеру структуры JET_RECORDLIST .

  • Параметр cindexrange равен нулю.

  • Параметр cindexrange больше 64.

  • Член cbStruct для любого элемента в массиве, заданном параметром rgindexrange , не равен размеру структуры JET_IndexRange .

  • Элементы в массиве rgindexrange содержат JET_TABLEIDиз разных таблиц.

  • Элемент в массиве rgindexrange содержит JET_TABLEID , который не расположен во вторичном индексе.

  • Один или несколько элементов в массиве rgindexrange содержат JET_TABLEID, расположенные по одному и тому же вторичному индексу.

JET_errInvalidSesid

Дескриптор сеанса недопустим или относится к закрытому сеансу.

Эта ошибка возвращается не при всех обстоятельствах. Дескрипторные данные проверяются только по мере усилий.

JET_errNotInitialized

Невозможно выполнить операцию, так как экземпляр, связанный с сеансом, не инициализирован.

JET_errOutOfCursors

Операция завершилась сбоем, так как подсистеме не удалось выделить ресурсы, необходимые для открытия нового курсора. Ресурсы курсора настраиваются путем вызова JetSetSystemParameter с JET_paramMaxCursors , указанным в параметре paramid .

JET_errOutOfMemory

Операция завершилась сбоем, так как для ее завершения не удалось выделить недостаточно памяти.

JetIntersectIndexes может возвращать JET_errOutOfMemory, если адресное пространство хост-процесса становится слишком фрагментировано. Диспетчер временных таблиц всегда выделяет 1 МБ адресного пространства для каждой временной таблицы, созданной независимо от объема хранимых данных. JetIntersectIndexes создаст одну временную таблицу для каждого JET_IndexRange , указанного в параметре rgindexrange , и одну временную таблицу для выходных данных в JET_RECORDLIST.

JET_errRestoreInProgress

Невозможно выполнить операцию, так как операция восстановления выполняется в экземпляре, связанном с сеансом.

JET_errSessionSharingViolation

Использование одного сеанса из нескольких потоков одновременно недопустимо.

Windows XP: Это возвращаемое значение появилось в Windows XP.

JET_errTermInProgress

Невозможно завершить операцию, так как экземпляр, связанный с сеансом, завершает работу.

JET_errTooManyOpenIndexes

Операция завершилась сбоем, так как подсистеме не удалось выделить ресурсы, необходимые для кэширования индексов таблицы. Число индексов, схема которых может кэшироваться, настраивается с помощью JetSetSystemParameter с JET_paramMaxOpenTables , указанным в параметре paramid .

JET_errTooManyOpenTables

Операция завершилась сбоем, так как подсистеме не удалось выделить ресурсы, необходимые для кэширования схемы таблицы. Количество таблиц, схема которых может быть кэширована, настраивается с помощью JetSetSystemParameter с JET_paramMaxOpenTables , указанным в параметре paramid .

JET_errTooManySorts

Операция завершилась сбоем, так как подсистеме не удалось выделить ресурсы, необходимые для создания временной таблицы. Временные ресурсы таблицы настраиваются с помощью JetSetSystemParameter с JET_paramMaxTemporaryTables, указанным в параметре paramid .

При успешном выполнении возвращается новая временная таблица, содержащая закладки записей, которые соответствуют критериям, представленным каждым из описаний диапазона входных индексов.

В случае сбоя временная таблица, содержащая результаты, не будет создана. Состояние временной базы данных может быть изменено. Состояние всех обычных баз данных, используемых ядром СУБД, останется неизменным. Текущее положение JET_TABLEID, предоставленных этой функции, может быть изменено.

Комментарии

JetIntersectIndexes можно использовать для эффективной фильтрации записей в таблице по нескольким критериям, если эти критерии могут быть выражены в терминах вторичных индексов для этой таблицы. Например, предположим, что у вас очень большая таблица, содержащая людей. Таблица может содержать столбцы для идентификатора пользователя, имени, фамилии и т. д. Предположим, что каждый из этих столбцов индексируется отдельно и что основной индекс таблицы превышает идентификатор пользователя. Если вы хотите найти всех, чье имя начинается с A и фамилия начинается с G, выполните следующие действия:

  1. Откройте новый курсор на таблице и задайте для этого курсора использование индекса по столбцу "имя". Затем настройте диапазон индексов для всех пользователей, чье "имя" началось с "A", и создайте JET_IndexRange структуру, содержащую этот курсор.

  2. Повторите шаг 1 с новым курсором на индексе "фамилия" для всех пользователей, чьи "фамилия" начиналась с "G".

  3. Передайте эти критерии в JetIntersectIndexes , чтобы вычислить результат во временной таблице.

  4. Просматривайте временную таблицу и извлеките каждую из записей, которые передают условия по закладке.

Временная таблица, содержащая результирующий набор, представляет собой простую таблицу с одним столбцом, который содержит закладку каждой записи, которая прошла все критерии, используемые для вычисления пересечения. Результирующий набор сортируется в том же порядке, что и основной индекс, и не содержит повторяющихся записей. Приложение может перечислять результаты пересечения, перечисляя строки во временной таблице, извлекая закладку для каждого результата с помощью JetRetrieveColumn, а затем посещая запись в базе данных, вызывая JetGotoBookmark с этой закладкой на курсоре, размещенном в основном индексе.

Временная таблица, возвращаемая JetIntersectIndexes , может сканироваться только в направлении вперед. Он также должен быть закрыт через JetCloseTable после завершения сканирования. Дополнительные сведения о временных таблицах и их работе см. в разделе JetOpenTemporaryTable.

JetIntersectIndexes обычно является эффективным и удобным способом фильтрации записей на основе нескольких индексированных критериев. Однако есть несколько важных советов, которые следует следовать, чтобы максимально повысить полезность этой функции. Если вы знаете, что один из критериев настолько ограничительный, что результирующий диапазон индексов содержит очень мало записей, то, вероятно, лучше просто пройти этот диапазон индексов и отфильтровать записи на уровне приложения. Кроме того, если вы знаете, что у вас есть критерии, которые являются гораздо менее строгими, чем другие критерии в пересечении, вы можете рассмотреть возможность удаления этих гораздо менее ограничительных критериев из пересечения. Наконец, если известно, что один из критериев не является ограничивающим, так что результирующий диапазон индексов почти так же велик, как основной индекс, то маловероятно, что пересечение с этим диапазоном индексов принесет пользу результирующего набора (уменьшить размер). Во всех случаях следует выбирать критерии таким образом, чтобы использовать наименьшее возможное количество записей индекса во входных данных и создавать наиболее конкретный набор закладок для выходных данных для достижения максимальной производительности.

Требования

Требование Значение

Клиент

Требуется Windows Vista, Windows XP или Windows 2000 Профессиональная.

Сервер

Требуется Windows Server 2008, Windows Server 2003 или Windows 2000 Server.

Верхняя часть

Объявлено в Esent.h.

Библиотека

Используйте ESENT.lib.

DLL

Требуется ESENT.dll.

См. также:

JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JET_IndexRange
JET_RECORDLIST
JetGotoBookmark
JetRetrieveColumn
JetSetIndexRange