Функция 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 по следующим причинам:
|
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, выполните следующие действия:
Откройте новый курсор на таблице и задайте для этого курсора использование индекса по столбцу "имя". Затем настройте диапазон индексов для всех пользователей, чье "имя" началось с "A", и создайте JET_IndexRange структуру, содержащую этот курсор.
Повторите шаг 1 с новым курсором на индексе "фамилия" для всех пользователей, чьи "фамилия" начиналась с "G".
Передайте эти критерии в JetIntersectIndexes , чтобы вычислить результат во временной таблице.
Просматривайте временную таблицу и извлеките каждую из записей, которые передают условия по закладке.
Временная таблица, содержащая результирующий набор, представляет собой простую таблицу с одним столбцом, который содержит закладку каждой записи, которая прошла все критерии, используемые для вычисления пересечения. Результирующий набор сортируется в том же порядке, что и основной индекс, и не содержит повторяющихся записей. Приложение может перечислять результаты пересечения, перечисляя строки во временной таблице, извлекая закладку для каждого результата с помощью 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