Структура JET_INDEXCREATE

Применимо к: Windows | Windows Server

Структура JET_INDEXCREATE содержит сведения, необходимые для создания индекса данных в базе данных ESE. Структура используется такими функциями, как JetCreateIndex2, и в таких структурах, как JET_TABLECREATE и JET_TABLECREATE2.

typedef struct tagJET_INDEXCREATE {
  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_INDEXCREATE;

Элементы

cbStruct

Размер данной структуры (в байтах). Задайте для этого элемента значение sizeof( JET_INDEXCREATE ).

szIndexName

Имя создаваемого индекса.

Имя индекса должно соответствовать следующим условиям:

  • Оно должно быть меньше JET_cbNameMost, не включая завершающее значение NULL.

  • Он должен состоять из следующих символов: от 0 (ноля) до 9, от A до Z, от a до z и всех других знаков препинания, кроме "!" (восклицательный знак), "," (запятая), "[" (открывающая скобка) и "]" (закрывающая скобка) — символы ASCII 0x20, 0x22 0x2d, 0x2f 0x5a, 0x5c, 0x5d 0x7f.

  • Она не должна начинаться с пробела.

  • Он должен состоять по крайней мере из одного непространствого символа.

szKey

Указатель на строку с двойным завершением null маркеров с разделителями NULL.

Каждый токен имеет форму "<имя столбца-описатель><> направления", где спецификация направления имеет значение "+" или "-". Например, szKey "+abc\0-def\0+ghi\0" будет индексироваться по трем столбцам "abc" (в порядке возрастания), "def" (в порядке убывания) и "ghi" (в порядке возрастания). В языке C строковые литералы имеют подразумеваемый признак конца NULL ; Таким образом, приведенная выше строка будет завершена двойным значением NULL.

Число столбцов, указанных в szKey , не может превышать значение JET_ccolKeyMost (константы, зависящей от версии).

По крайней мере один столбец должен иметь имя в szKey.

Устаревшее поведение. После признака конца double-NULL можно указать идентификатор языка (WORD, который передается в MAKELCID( langid, SORT_DEFAULT ) для указания LCID для индекса. Недопустимо указывать идентификатор языка в szKey и LCID в JET_UNICODEINDEX (задав JET_bitIndexUnicode в grbit).

Не рекомендуется: после идентификатора языка можно передать cbVarSegMac в качестве USHORT. Поведение не определено, если USHORT задан как в szKey, так и в случае , если 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 не влияет на лень обновления данных. Если операция индексирования прерывается завершением процесса, soft Recovery по-прежнему сможет привести базу данных в согласованное состояние, но индекс может отсутствовать.

JET_bitIndexEmpty

Не пытайтесь создать индекс, так как все записи будут иметь значение NULL. При передаче JET_bitIndexEmpty необходимо также указать JET_bitIgnoreAnyNull. Это повышение производительности. Например, при добавлении нового столбца в таблицу создается индекс для этого добавленного столбца, и все записи в таблице проверяются, даже если они не добавляются в индекс. При указании JET_bitIndexEmpty пропускается проверка таблицы, что может занять много времени.

JET_bitIndexUnversioned

Приводит к тому, что создание индекса будет видимым для других транзакций. Как правило, сеанс транзакции не может видеть операцию создания индекса в другом сеансе. Этот флаг может быть полезен, если другая транзакция, скорее всего, создаст тот же индекс. Вторая операция создания индекса завершится сбоем, а не может привести к множеству ненужных операций базы данных. Вторая транзакция может не использовать индекс немедленно. Операция создания индекса должна быть завершена, прежде чем она будет доступна для использования. Сеанс не должен находиться в транзакции для создания индекса без сведений о версии.

JET_bitIndexSortNullsHigh

При указании этого флага значения NULL будут отсортированы после данных для всех столбцов в индексе.

JET_bitIndexUnicode

Указание этого флага влияет на интерпретацию поля объединения lcid/pidxunicde в структуре. Задание бита означает, что поле pidxunicode фактически указывает на структуру JET_UNICODEINDEX . JET_bitIndexUnicode не требуется для индексирования данных Юникода. Он используется только для настройки нормализации данных Юникода.

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

Указание этого флага для индекса с несколькими ключевыми столбцами, которые являются многозначными, приведет к созданию записи индекса для каждого результата перекрестного произведения всех значений в этих ключевых столбцах. В противном случае индекс будет иметь только одну запись для каждого многозначного ключевого столбца, который является многозначным столбцом, и каждая из этих записей индекса будет использовать первое многозначное значение из всех других ключевых столбцов, которые являются многозначными столбцами.

Например, если вы указали этот флаг для индекса в столбце A со значениями "красный" и "синий" и по столбцу B со значениями "1" и "2", будут созданы следующие записи индекса: "красный", "1"; "red", "2"; "синий", "1"; "синий", "2". В противном случае будут созданы следующие записи индекса: "red", "1"; "синий", "1".

JET_bitIndexCrossProduct появилась в операционной системе Windows Vista.

JET_bitIndexKeyMost 0x00008000

Если указать этот флаг, индекс будет использовать максимальный размер ключа, указанный в поле cbKeyMost в структуре. В противном случае индекс будет использовать JET_cbKeyMost (255) в качестве максимального размера ключа.

JET_bitIndexKeyMost появилась в Windows Vista.

JET_bitIndexDisallowTruncation 0x00010000

Указание этого флага приведет к сбою любого обновления индекса, которое приведет к сбою усеченного ключа с JET_errKeyTruncated. В противном случае ключи будут усекаются без уведомления. Дополнительные сведения об усечении ключа см. в разделе Функция JetMakeKey .

Windows Vista: JET_bitIndexDisallowTruncation появилась в Windows Vista.

JET_bitIndexNestedTable 0x00020000

Указание этого флага приведет к обновлению индекса по нескольким многозначным столбцам, но только со значениями одной и той же itagSequence.

JET_bitIndexNestedTable появилась в Windows Vista.

ulDensity

Процентная плотность дерева начального индекса B+. При указании числа меньше 100 требуется больше места для первоначального создания индекса, но при этом индекс будет расти в будущем, что позволяет избежать внутренней фрагментации.

lcid

Идентификатор языкового стандарта (LCID), используемый при нормализации данных, если значение JET_bitIndexUnicode не указано в параметре grbit . Код кода влияет на нормализацию, если индекс превышает столбцы Юникода.

pidxunicode

Указатель на структуру JET_UNICODEINDEX , если значение JET_bitIndexUnicode указано в параметре grbit . Это позволяет пользователю указать пользовательские флаги, которые передаются функции LCMapString во время нормализации Юникода.

cbVarSegMac

Максимальная длина (в байтах) каждого столбца для хранения в индексе, если значение JET_bitIndexTupleLimits не указано в параметре grbit .

Указание значения 0 (ноль) для этого поля эквивалентно:

  • Указание JET_cbPrimaryKeyMost для первичного индекса.

  • Указание JET_cbSecondaryKeyMost для вторичного индекса.

ptuplelimits

Указатель на структуру JET_TUPLELIMITS , если значение JET_bitIndexTupleLimits указано в параметре grbit .

ptuplelimits появился в Windows Server 2003.

rgconditionalcolumn

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

cConditionalColumn

Количество структур в массиве rgconditionalcolumn .

Err

Содержит код возврата для создания этого индекса.

cbKeyMost

Указывает максимальный допустимый размер ключей в индексе в байтах. Этот параметр игнорируется, если значение JET_bitIndexKeyMost не указано в параметре grbit . Если для этого параметра задано значение 0 и JET_bitIndexKeyMost указано в параметре grbit , вызывающая функция завершится сбоем с 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.

Комментарии

ESE поддерживает индексирование по ключевым столбцам, содержащим несколько значений. Чтобы использовать эту функцию, столбец должен быть типом столбца с тегами (JET_bitColumnTagged) и должен быть помечен для индексации нескольких значений с помощью JET_bitColumnMultiValued. В версиях Windows, предшествующих Windows Vista, только первый многозначный ключевой столбец в индексе будет иметь свои значения, развернутые в индексе. Для всех остальных многозначных столбцов и столбцов с тегами в индексе будут развернуты только первые значения.

Предположим, что в таблице существуют следующие строки (столбец Альфа не является многозначным, а столбцы Beta, Gamma и Delta являются многозначными), а индекс создается как "+Alpha\0+Beta\0+Gamma\0+Delta\0\0":

Коэффициент альфа

Бета-версия

Gamma

Разностная версия

1

ABC
GHI
JKL

MNO
PQR
СТЮ

VWX
YZ

2

TEH

ДОЖДЬ
ИСПАНИЯ

IN
ПАДАЕТ

Будут сохранены падающие кортежи индексов:

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

Обратите внимание, что {2,THE,SPAIN,IN} не хранится, хотя столбец Alpha во второй строке имеет одно многозначное значение.

В версиях Windows, начиная с Windows Vista, все многозначные столбцы можно развернуть в индексе, указав JET_bitIndexCrossProduct.

Требования

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

Клиент

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

Сервер

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

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

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

Юникод

Реализовано в виде JET_ INDEXCREATE_W (Юникод) и JET_ INDEXCREATE_A (ANSI).

См. также раздел

JET_COLTYP
JET_CONDITIONALCOLUMN
JET_ERR
JET_GRBIT
JET_TABLECREATE
JET_TABLECREATE2
JET_TUPLELIMITS
JET_UNICODEINDEX
JetCreateIndex2
JetSetColumn
JetUpdate