При создании индексных выражений имейте в виду следующие соображения:
-
Если вы укажете индексное выражение, котороое превышает ограничения установленные для индексов, то Visual FoxPro сгенерирует ошибку.
Длина индексного ключа в составном индексном (.cdx) файле должна быть в пределах от 1 до 240 символов. Длина индексного ключа в индексном (.idx) файле должна лежать в диапазоне от 1 до 100 символов. С некоторыми последовательностями сопоставления (collating sequences) или при использовании двухбайтных символьных наборов (DBCS), каждый символ в индексном выражении использует два символа в индексном ключе. В таким случаях максимальная длина индексного выражения снижается вдвое и составляет 120 символов (в составном индексном файле).
-
Если вы создаете индексное выражение с использованием численных полей, индекс организует записи по сумме полей, а не по самим полям.
-
Visual FoxPro не поддерживает переменную длину индексного ключа. Если вы попытаетесь построить индекс с ключом, который имеет различные длины, то ключ будет дополнен пробелами.
-
Не используйте для индексных выражений переменные, массивы элементов или поля, а также выражения полей из таблицы, открытой в другой рабочей области.
Есил вы попытаетесь получить доступ к индексу, который содержит переменную или поле, которые, либо не существуют, либо не могут быть найдны, то Visual FoxPro сгенерирует сообщение об ошибке.
-
Даже несмотря на то, что Visual FoxPro сгенерирует ошибку, все-таки возможно создать индексный ключ с нулевой (0) длиной.
При создании индекса Visual FoxPro оценивает поля в первой записи в таблице. Поэтому, если индексное выражение представляет собой подстроку пустого мемо-поля, то создается индекс нулевой длины.
Совет
Для избежания создания индексных ключей нулевой длины в случае, если поле ничего не содержит, может быть придется ввести в поле первой записи таблицы какие-то временные данные.
-
Visual FoxPro дополняет индексные ключи, основанные на полях с типами Character, Varchar, Varchar (Binary) и Varbinary и выражениях.
Индексные ключи, основанные на полях с типами Varchar, Varchar (Binary) и Varbinary и ваыражениях включают в себя дополнения, несмотря на то, что сами эти типы полей не используют дополнений по длине при хранении. Индексные поля, основанные на типах Varchar и Varchar (Binary) дополняются дополнительными пробелами, по аналогии с индексными ключами, основанными на полях типа Character и выражениях. Индексные выражения, основанные на полях с типом Varbinary или выражениях, дополняются нулями с правой стороны значения в поля до достижения длины, соответствующей максимальной длине поля, установленной при создании таблицы. Например, значения 0hAA, 0hAA00 и 0hAA000 будут иметь одинаковый индексный ключ 0hAA0000. Для получения более подробной информации смотрите Varchar Field Type и Varbinary Data Type.
-
Поля типов Memo и Blob не могут использоваться сами в индексных выражениях, поэтому они должны быть объединены с другими символьными выражениями и с другими символами в выражениях инедксного файла. Поля типа General не могут быть использованы в индексных выражениях.
Если вы включите в индексное выражение поле, снабженное префиксом псевдоимени таблицы или рабочей области (например: customer.subaaccount/a.subaccount) Visual FoxPro сгенерирует сообщение об ошибке.
-
Опасайтесь использования псевдоимен полей при создании индексов, даже несмотря на то, что вы можете оптимизировать опцию FOR (с технологией Rushmore Query Optimization) в которую включены поля с псевдоименами.
В некоторых случаях, например, при использовании команд USE...AGAIN и SQL запросов, таблице автоматически присваиваются различные псевдоимена и индекс, в таких случаях, может быть неверно обновлен или использован. Для получения более подробной о технологии оптимизации Rushmore смотрите Использование оптимизации запросов Rushmore для ускорения доступа к данным.
-
Хотя индексные выражения могут включать в себя пользовательские функции (UDF), все-таки не рекоменуется включать их в индексное варажение.
Хотя обе, и хранимая процедура, и пользовательская функция, использованные в индексном выражении приводят к увеличению времени создания индекса или его обновления, но, если ваша таблица ассоциирована с контейнером базы данных, советуем использовать хранимые процедуры, а не пользовательские функции в ваших индексных выражениях.
Если вы используете свои собственные пользовательские функции (UDF) в индексных выражениях, Visual FoxPro должен быть способен найти их. Когда Visual FoxPro создает индекс, то индексное выражение сохраняется в индексном файле; однако в случае UDF, включенной в индексное выражения, в индексный файл будет включена только ссылка на нее. UDF хранятся в файле, которые не связваны с базой данных; поэтому, возможно перемещение или удаление файла, содержащего пользовательскую функцию, что приведет к образованию недействительной ссылки на пользовательскую функцию в индексном выражении.
В противоположность пользовательским функциям, код хранимой процедуры хранится в файле контейнера базы данных (.dbc) и может быть всегда найден Visual FoxPro. Кроме того, ссылка на хранимую процедуру в индексном выражении гарантирует, что индекс основывается на точном указанном вами коде.
Кроме того, обновление индекса может вообще не произойти, если пользовательская функция находится вне области видимости приложения, которое изменяет индекс. Если вы используете UDF в ваших индексных выражениях, Visual FoxPro использует любую UDF, которая находится в зоне видимости приложения в момент индексирования таблицы и имеет одинаковое имя со ссылаемой в индексном выражении функцией.
Если вы используете UDF, ассоциированную с базой данной в индексном выражении, Visual FoxPro обрабатывает выражение в той же манере, в какой он обслуживает выражения правил и триггеров, которые содержат UDF. Для получения подробной информации смотрите Усиление правил бизнес-логики и Использование триггера.
-
Убедитесь, что использование функции не зависит от установки текущей кодовой страницы при создании индекса, которое могло бы быть изменено при использовании других кодовых страниц. Результаты, возвращаемые некоторыми функциями могут различаться в зависимости от текущей кодовой страницы.
Например, функция UPPER( ) использует кодовую страницу для преобразования строки и может даже иметь следствием непредсказуемый результат, если индекс изменяется при смене кодовых страниц. Вы можете вместо указанной функции использовать фукнцию STRCONV( ),
STRCONV(...,8,...)
.Visual FoxPro оценивает индексные выражения путем чтения символов из таблицы без дополнительной трансляции кодовой страницы, даже если текущая кодовая страница (CPCURRENT()) не соответствует кодовой странице индексируемой таблицы (CPDBF()) для того, чтобы обеспечить одинаковый результат независимо от текущей кодовой страницы.