Структура JET_INDEXCREATE2

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

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

Структура JET_INDEXCREATE2 появилась в операционной системе Windows 7.

typedef struct tagJET_INDEXCREATE2 {
  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_SPACEHINTS* pSpacehints;
} JET_INDEXCREATE;

Элементы

cbStruct

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

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 , поэтому приведенная выше строка будет заканчиваться значением double-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 не влияет на лень обновления данных. Если операция индексирования прерывается завершением процесса, обратимое восстановление по-прежнему сможет привести базу данных в согласованное состояние, но индекс может отсутствовать.

JET_bitIndexEmpty

Не пытайтесь создать индекс, так как все записи будут иметь значение NULL. grbit НЕОБХОДИМО также указать JET_bitIgnoreAnyNull при передаче JET_bitIndexEmpty. Это повышение производительности. Например, если в таблицу добавляется новый столбец, а затем создается индекс для этого добавленного столбца, все записи в таблице проверяются, даже если они не добавляются в индекс. Указание JET_bitIndexEmpty пропускает сканирование таблицы, что может занять много времени.

JET_bitIndexUnversioned

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 со значениями "red" и "blue" и по столбцу B со значениями "1" и "2", будут созданы следующие записи индекса: "red", "1"; "red", "2"; "blue", "1"; "blue", "2". В противном случае будут созданы следующие записи индекса: "red", "1"; "blue", "1".

Значение JET_bitIndexCrossProduct появилось в Windows Vista.

JET_bitIndexKeyMost
0x00008000

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

Значение JET_bitIndexKeyMost появилось в Windows Vista.

JET_bitIndexDisallowTruncation
0x00010000

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

Значение JET_bitIndexDisallowTruncation появилось в 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 . Если этот параметр равен нулю и 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.

PSpacehints

Указатель на структуру JET_SPACEHINTS .

PSpacehints появился в Windows 7.

Комментарии

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} не хранится, несмотря на то, что столбец Альфа во второй строке имеет одно многозначное значение.

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

Требования

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

Клиент

Требуется Windows Vista, Windows XP или Windows 2000 Professional.

Сервер

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

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

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

Юникод

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

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

JET_COLTYP
JET_CONDITIONALCOLUMN
JET_ERR
JET_GRBIT
JET_TABLECREATE
JET_TABLECREATE2
JET_TUPLELIMITS
JET_UNICODEINDEX
JetCreateIndex2
JetSetColumn
JetUpdate