Функция JetOpenTempTable
Применимо к: Windows | Windows Server
Функция JetOpenTempTable
Функция JetOpenTempTable создает временную таблицу с одним индексом. Временная таблица хранит и извлекает записи так же, как обычная таблица, созданная с помощью JetCreateTableColumnIndex. Однако временные таблицы выполняются гораздо быстрее, чем обычные таблицы из-за их нестабильной природы. Их также можно использовать для очень быстрой сортировки и удаления дубликатов наборов записей при доступе исключительно последовательно.
JET_ERR JET_API JetOpenTempTable(
__in JET_SESID sesid,
__in const JET_COLUMNDEF* prgcolumndef,
__in unsigned long ccolumn,
__in JET_GRBIT grbit,
__out JET_TABLEID* ptableid,
__out JET_COLUMNID* prgcolumnid
);
Параметры
sesid
Используемый сеанс.
prgcolumndef
Определения столбцов для столбцов, созданных во временной таблице.
Существуют важные ограничения для параметров определения столбцов, используемых с временной таблицей. Дополнительные сведения см. в разделе "Примечания".
Помимо обычных параметров определения столбцов, можно также указать ноль или несколько следующих параметров, которые актуальны только в контексте временной таблицы.
Значение |
Значение |
---|---|
JET_bitColumnTTDescending |
Порядок сортировки ключевого столбца для временной таблицы должен быть по убыванию, а не по возрастанию. Если этот параметр указан без JET_bitColumnTTKey этот параметр игнорируется. |
JET_bitColumnTTKey |
Столбец будет ключевым для временной таблицы. Порядок определений столбцов с этим параметром, заданным во входном массиве, определяет приоритет каждого ключевого столбца для временной таблицы. Первым определением столбца в массиве с этим набором параметров будет самый важный ключевой столбец и т. д. Если запрашивается больше ключевых столбцов, чем поддерживается ядром СУБД, этот параметр игнорируется для неподдерживаемых ключевых столбцов. |
ccolumn
См. prgcolumndef.
grbit
Группа битов, задающая ноль или несколько следующих параметров.
Значение |
Значение |
---|---|
JET_bitTTErrorOnDuplicateInsertion |
Любая попытка вставки записи с тем же ключом индекса, что и ранее вставленная запись, немедленно завершится ошибкой с JET_errKeyDuplicate. Если этот параметр не запрашивается, дубликата обнаруживается немедленно и завершается сбоем или удаляется автоматически позже в зависимости от стратегии, выбранной ядром СУБД для реализации временной таблицы на основе запрошенных функциональных возможностей. Если эта функция не требуется, лучше не запрашивать ее. Если эта функция не запрашивается, диспетчер временных таблиц может выбрать стратегию управления временной таблицей, что приведет к повышению производительности. |
JET_bitTTForceMaterialization |
Заставляет диспетчер временных таблиц отказаться от поиска оптимальной стратегии для использования управления временной таблицей, что приведет к повышению производительности. |
JET_bitTTForwardOnly |
Временная таблица создается только в том случае, если диспетчер временных таблиц может использовать реализацию, оптимизированную для промежуточных результатов запроса. Если какая-либо характеристика временной таблицы не позволит использовать эту оптимизацию, операция завершится сбоем с JET_errCannotMaterializeForwardOnlySort. Побочным эффектом этого параметра является разрешение временной таблице содержать записи с повторяющимися ключами индекса. Дополнительные сведения см. в разделе JET_bitTTUnique. Этот параметр доступен только в Windows Server 2003 и более поздних выпусках. |
JET_bitTTIndexed |
Этот параметр требует, чтобы временная таблица была достаточно гибкой, чтобы использовать JetSeek для поиска записей по ключу индекса. Если эта функция не требуется, лучше не запрашивать ее. Если эта функция не запрашивается, диспетчер временных таблиц может выбрать стратегию управления временной таблицей, что приведет к повышению производительности. |
JET_bitTTUnique |
Запрашивает удаление записей с повторяющимися ключами индекса из окончательного набора записей во временной таблице. До Windows Server 2003 ядро СУБД всегда предполагало, что этот параметр действует, так как все кластеризованные индексы также должны быть первичными и, следовательно, должны быть уникальными. В Windows Server 2003 теперь можно создать временную таблицу, которая не удаляет дубликаты при указании параметра JET_bitTTForwardOnly. Невозможно узнать, какие дубликаты будут успешными, а какие дубликаты будут удалены, в целом. Однако при запросе параметра JET_bitTTErrorOnDuplicateInsertion первая запись с заданным ключом индекса для вставки во временную таблицу всегда будет успешной. |
JET_bitTTUpdatable |
Запрашивает, чтобы временная таблица была достаточно гибкой, чтобы разрешить последующее изменение записей, которые были вставлены ранее. Если эта функция не требуется, лучше не запрашивать ее. Если эта функция не запрашивается, диспетчер временных таблиц может выбрать стратегию управления временной таблицей, что приведет к повышению производительности. |
JET_bitTTScrollable |
Запрашивает, чтобы временная таблица была достаточно гибкой, чтобы разрешить сканирование записей в произвольном порядке и направлении с помощью JetMove. Если эта функция не требуется, лучше не запрашивать ее. Если эта функция не запрашивается, диспетчер временных таблиц может выбрать стратегию управления временной таблицей, что приведет к повышению производительности. |
JET_bitTTSortNullsHigh |
Запрашивает сортировку значений ключевых столбцов NULL ближе к концу индекса, чем значений столбцов, отличных от NULL. |
JET_bitTTIntrinsicLVsOnly |
Запрашивает разрешение только внутренних длинных значений. Windows 7: JET_bitTTIntrinsicLVsOnly появилась в Windows 7. |
ptableid
Выходной буфер, который получает новый курсор, открытый во вновь созданной временной таблице.
prgcolumnid
Выходной буфер, получающий массив идентификаторов столбцов, созданных во время создания временной таблицы.
Идентификаторы столбцов в этом массиве в точности соответствуют входному массиву определений столбцов. В результате размер этого буфера должен соответствовать размеру входного массива.
Возвращаемое значение
Эта функция возвращает тип данных JET_ERR с одним из следующих кодов возврата. Дополнительные сведения о возможных ошибках ESE см. в разделах Ошибки подсистемы расширяемого хранилища и Параметры обработки ошибок.
Код возврата |
Описание |
---|---|
JET_errSuccess |
Операция выполнена успешно. |
JET_errCannotMaterializeForwardOnlySort |
Сбой JetOpenTempTable , так как JET_bitTTForwardOnly указан, а временную таблицу не удалось создать с помощью оптимизации только для пересылки. Эта ошибка будет возвращена только в Windows Server 2003 и более поздних выпусках. |
JET_errClientRequestToStopJetService |
Невозможно выполнить операцию, так как все действия экземпляра, связанного с сеансом, прекратились в результате вызова JetStopService. |
JET_errIndexInvalidDef |
Не удалось создать индекс, так как указано недопустимое определение индекса. JetOpenTempTable вернет эту ошибку, если:
Эта ошибка будет возвращена только Windows 2000. |
JET_errInstanceUnavailable |
Невозможно выполнить операцию, так как экземпляр, связанный с сеансом, столкнулся с неустранимой ошибкой, требующей отмены доступа ко всем данным для защиты целостности этих данных. Эта ошибка будет возвращена только в Windows XP и более поздних выпусках. |
JET_errInvalidCodePage |
Для поля cp JET_COLUMNDEF не задана допустимая кодовая страница. Единственными допустимыми значениями для текстовых столбцов являются английский (1252) и Юникод (1200). Значение 0 означает, что будет использоваться значение по умолчанию (английский, 1252). |
JET_errInvalidColumnType |
Для поля coltypJET_COLUMNDEF не задан допустимый тип столбца. |
JET_errInvalidLanguageId |
Не удалось создать индекс, так как была предпринята попытка использовать недопустимый идентификатор языкового стандарта. Код языкового стандарта может быть либо полностью недопустимым, либо не установлен соответствующий языковой пакет. |
JET_errInvalidLCMapStringFlags |
Не удалось создать индекс, так как была предпринята попытка использовать недопустимый набор флагов нормализации. Эта ошибка будет возвращена только в Windows XP и более поздних выпусках. В Windows 2000 недопустимые флаги нормализации приведут к JET_errIndexInvalidDef. |
JET_errInvalidSesid |
Дескриптор сеанса недопустим или ссылается на закрытый сеанс. Примечание Эта ошибка не возвращается при любых обстоятельствах. Дескрипторы проверяются только на основе наилучших усилий. |
JET_errNotInitialized |
Невозможно выполнить операцию, так как экземпляр, связанный с сеансом, еще не инициализирован. |
JET_errOutOfCursors |
Операция завершилась сбоем, так как подсистеме не удается выделить ресурсы, необходимые для открытия нового курсора. Ресурсы курсора настраиваются с помощью JetSetSystemParameter с JET_paramMaxCursors. |
JET_errOutOfMemory |
Операция завершилась сбоем, так как для ее завершения было выделено недостаточно памяти. JetOpenTempTable может возвращать JET_errOutOfMemory, если адресное пространство хост-процесса становится слишком фрагментировано. Диспетчер временных таблиц всегда выделяет блок адресного пространства размером 1 МБ для каждой созданной временной таблицы независимо от объема хранимых данных. |
JET_errRestoreInProgress |
Невозможно выполнить операцию, так как операция восстановления выполняется в экземпляре, связанном с сеансом. |
JET_errSessionSharingViolation |
Один и тот же сеанс нельзя использовать одновременно для нескольких потоков. Эта ошибка будет возвращена только в Windows XP и более поздних выпусках. |
JET_errTermInProgress |
Невозможно выполнить операцию, так как экземпляр, связанный с сеансом, завершает работу. |
JET_errTooManyColumns |
Предпринята попытка добавить в таблицу слишком много столбцов. Таблица может содержать не более JET_ccolFixedMost фиксированных столбцов, не более JET_ccolVarMost столбцов переменной длины и не более JET_ccolTaggedMost столбцов с тегами. |
JET_errTooManyOpenIndexes |
Операция завершилась сбоем, так как подсистеме не удается выделить ресурсы, необходимые для кэширования индексов таблицы. Число индексов, схема которых может быть кэширована, настраивается с помощью JetSetSystemParameter с JET_paramMaxOpenTables. |
JET_errTooManyOpenTables |
Операция завершилась сбоем, так как подсистеме не удается выделить ресурсы, необходимые для кэширования схемы таблицы. Количество таблиц, схема которых может быть кэширована, настраивается с помощью JetSetSystemParameter с JET_paramMaxOpenTables. |
JET_errTooManySorts |
Операция завершилась сбоем, так как подсистеме не удается выделить ресурсы, необходимые для создания временной таблицы. Временные ресурсы таблицы настраиваются с помощью JetSetSystemParameter с JET_paramMaxTemporaryTables. |
При успешном выполнении будет возвращен курсор, открытый во вновь созданной временной таблице. Состояние временной базы данных будет подготовлено для размещения новой временной таблицы. Состояние всех обычных баз данных, используемых ядром СУБД, останется неизменным.
В случае сбоя временная таблица не будет создана, и курсор не будет возвращен. Состояние временной базы данных может быть изменено. Состояние всех обычных баз данных, используемых ядром СУБД, останется неизменным.
Комментарии
Временные таблицы не поддерживают полное дополнение параметров определения столбцов, которые обычно поддерживаются ядром СУБД. На самом деле поддерживаются только JET_bitColumnFixed и JET_bitColumnTagged. Это означает, что невозможно создать столбец с автоматическим приращением, версией или многозначным столбцом во временной таблице. Наконец, столбцы депонирования обновления не поддерживаются, так как они не являются полезными во временной таблице, так как они могут использоваться только одним сеансом за раз. Если запрашивается какой-либо из этих параметров, они будут игнорироваться.
Временные таблицы не поддерживают значения по умолчанию. Если указано определение столбца, содержащее спецификацию значения по умолчанию, эта спецификация будет игнорироваться.
Временные таблицы возвращаются вызывающей объекту в результате выполнения множества различных функций ESE. Например, JetGetIndexInfo с параметром JET_IdxInfo, заданным в параметре InfoLevel , вернет временную таблицу, содержащую список всех ключевых столбцов в заданном индексе. Временные таблицы следуют тем же правилам жизненного цикла, что и обычные временные таблицы, как описано здесь.
Временные таблицы также используются внутренним ядром СУБД для выполнения многих задач. Наиболее важной из этих задач является создание индекса для существующей таблицы. Временная таблица будет использоваться для сортировки ключей индекса, используемых для создания этого индекса.
Все временные таблицы хранятся во временной базе данных. Временная база данных — это специальный файл базы данных, который хранится в течение жизненного цикла экземпляра ESE и удаляется при завершении работы или перезапуске этого экземпляра. Расположение временной базы данных можно настроить с помощью JetSetSystemParameter с JET_paramTempPath. Размещение временной базы данных на диске относительно файлов журнала транзакций и файлов базы данных может быть важно, если приложение интенсивно использует временные таблицы или часто создает индексы.
Жизненный цикл временной таблицы привязан к курсорам, ссылающимся на нее. Если все курсоры, ссылающиеся на временную таблицу, будут закрыты (неявно или явно), то временная таблица будет удалена. Если временная таблица создается внутри транзакции и эта транзакция впоследствии откатывается, временная таблица будет удалена, так как все курсоры, которые ссылались на нее в данный момент, будут неявно закрыты. Новые курсоры могут ссылаются на временную таблицу только с помощью JetDupCursor. В этом случае новые курсоры будут расположены в первой записи индекса временной таблицы. JetDupCursor будет работать только на определенных этапах использования временной таблицы. Дополнительные сведения см. в примечаниях, касающихся временных табличных курсоров. Нельзя ссылаться на временную таблицу из нескольких сеансов одновременно.
Существует важная проблема в JetDupCursor , которая влияет на временные таблицы. Если предпринята попытка дублировать временную таблицу, которая находится в режиме "только пересылка", результирующий курсор будет создан неправильно и не будет работать. По-прежнему безопасно дублировать курсор на материализованную временную таблицу.
Диспетчер временных таблиц может реализовать временную таблицу тремя способами. Первый способ заключается в обслуживании таблицы в памяти. Эта стратегия является самой быстрой, но ее можно использовать только для небольших простых временных таблиц. Второй метод — создание сортировки на основе диска, которая может управляться с помощью итератора только для пересылки. Эта стратегия может использоваться только при определенных обстоятельствах и является самым быстрым способом сортировки и удаления дубликатов из очень большого набора данных. Третий способ — создать дерево B+ во временной базе данных для хранения временной таблицы. Эта стратегия является самой медленной, но наиболее универсальной и называется материализованной временной таблицей. Эти стратегии можно использовать в сочетании для достижения функциональных возможностей, требуемых для временной таблицы.
Если временная таблица не материализована, она используется в основном на двух основных этапах. Первый этап — это этап вставки, на котором таблица заполняется своим исходным набором данных. На этом этапе допускается только вставка данных. Этот этап завершается при попытке переместить курсор с помощью JetMove или JetSeek. Второй этап — это этап извлечения данных. На этом этапе данные, хранящиеся во временной таблице, могут быть извлечены в соответствии с возможностями, запрошенными при создании временной таблицы.
Возможности временных табличных курсоров
При материализации временной таблицы курсор имеет следующие возможности, но может быть дополнительно ограничен запрошенными параметрами:
Если временная таблица не материализована и находится на этапе вставки, курсор имеет следующие возможности, но может быть дополнительно ограничен запрошенными параметрами:
-
Примечание Вызывает переход на фазу извлечения.
-
Примечание Вызывает переход на фазу извлечения.
Если временная таблица не материализована и находится на этапе извлечения, курсор имеет следующие возможности, но может быть дополнительно ограничен запрошенными параметрами:
-
Примечание Если предпринята попытка дублировать временную таблицу, которая находится в режиме "только пересылка", результирующий курсор будет создан неправильно и не будет работать. По-прежнему безопасно дублировать курсор на материализованную временную таблицу.
Требования
Требование | Значение |
---|---|
Клиент |
Требуется Windows Vista, Windows XP или Windows 2000 Профессиональная. |
Сервер |
Требуется Windows Server 2008, Windows Server 2003 или Windows 2000 Server. |
Верхняя часть |
Объявлено в Esent.h. |
Библиотека |
Используйте ESENT.lib. |
DLL |
Требуется ESENT.dll. |
См. также:
JET_COLUMNDEF
JET_COLUMNID
JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JET_UNICODEINDEX
JetCloseTable
JetCreateTableColumnIndex
JetDupCursor
JetMove
JetRollback
JetSeek
JetSetSystemParameter
Параметры временной базы данных