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

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

Индексы, основанные на простых выражениях

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

NoteСовет

Если вы желаете включить в индексное выражение поля с разными типами данных, то сконвертируйте все несимвольные поля в символьные путем включения имени поля в функцию STR( ).

Например, предположим, что, вы желаете организовать данные по максимальной сумме счета и затем по имени компании. Приведенный ниже пример преобразует поля MaxOrdAmt field, которое имеет тип Currency, таким образом, чтобы оно могло быть соединено с полем Company, которое имеет тип Character:

  CopyCode image Скопировать код
STR(customer.maxordamt,20,4) + customer.company

Для получения более подробной информации смотрите STR( ).

Одно или более полей в индексных выражениях

Когда вы включаете одно или более полей в индексное выражение, вы можете выполнять описанные ниже задачи:

  • Сортировать данные в порядке, в котором поля появились в индексном выражении.

    Visual FoxPro оценивает поля в порядке, в котором они появились в индексном выражении. Например, предположим что вы желаете видеть записи в таблице customer, отсортированными по стране (поле country), региону (поле region) и затем по признаку потребителя (поле ID). Приведенное выражение создает индекс для таблицы customer с помощью использования знака "плюс" для объединения множества полей:

      CopyCode imageСкопировать код
    customer.country + customer.region + customer.cust_id
  • Предотвратить появление дибликатов значений в таблице с помощью использования первичного индекса или индекса-кандидата, которые включают в себя одно и более полей.

    Для получения более подробной информации о контроле над дублирующими друг друга значениями прочитайте Дублированные значения в полях.

  • Оптимизировать производительность и увеличить скорость запросов и представлений с фильтрами на более чем одном поле с помощью включения более одного поля в индексное выражение.

    Путем включения поля, которое изменяется в меньшей степени, в начало индексного выражения, индексирование может быть ограничено теми полями, значения данных в которых изменяются более часто. Например, предположим вы пожелаете организовать записи в таблице customer по стране, почтовому коду внутри страны и по имени компании за почтовым кодом. В приведенном ниже примере поле Country появляется в начале списка, посольку оно изменяется не так часто:

      CopyCode image Скопировать код
    customer.country + customer.postal_code + customer.company

Использование полей из других таблиц в индексном выражении

Вы можете создавать индексное выражение, которое ссылается на поля в другой таблице, например, поля таблицы открытой в другой рабочей области. Однако, рекомендуем вам использовать подобное построение индекса для случаяе, когда вы будете хранить индексные тэги, которые ссылаются на поля более чем в одной таблице в отдельном индексном файле (.idx), вместо хранения их в ассоциированном структурном индексном файле (.cdx). Когда индексный тэг для одной таблицы ссылкается на другую таблицу, Visual FoxPro не позволит открытие таблицы, связанной с .cdx файлом до тех пор пока вы не откроете другую таблицу, на которую имеется ссылка в индексном тэге.

  CopyCode imageСкопировать код
customer.country + customer.region + customer.cust_id

Индексы, основанные на сложных выражениях

Вы можете создать индексы, используя сложные выражения, которые могут содержит константы, функции Visual FoxPro, хранимые процеду и функции, определенные пользователем. Для получения преимуществ, связанных с Rushmore Query Optimization, индексное выражение должно точно соответствовать критериями оптимизации.

Функции Visual FoxPro в индексных выражениях

Вы можете использовать в индексных выражениях родные функции Visual FoxPro.

Самый простой пример - использование функции STR( ) для преобразования численных значений в символьные строки. Предположим, что вы желаете создать индекс для таблицы customer, уоторый объединит поле ID с максимальной суммой счета в заказе. Вы можете преобразовать значения поля из Currency в Character используя приведенный ниже код:

  CopyCode imageСкопировать код
INDEX ON cust_id + STR(maxordamt, 8, 2) TAG custmaxord

Если вы желаете снизить размер индекса для полей с целочисленными значениями, вы можете преобразовать целочисленные значения в их бинарные символьные представления с помощью функции BINTOC( ). Кроме того,  вы можете преобразовать бинарные значения в целочисленные с помощью функции CTOBIN( ).

Если вы желаете создать индекс для сортировки таблицы в хронологическом порядке вы можете использовать функцию DTOS( ) для преобразования значений в полях типа date в символьные строки. Например, предположим, что вы желаете иметь доступ к таблице работников по дате найма и идентификатору ID. Приведенный ниже пример кода создает индексное выражение выполняющее эту задачу:

  CopyCode imageСкопировать код
INDEX ON DTOS(hire_date) + emp_id TAG id_hired

Для получения более подробной информации смотрите описание функций STR( ), BINTOC( ), CTOBIN( ) и DTOS( ).

Хранимые процедуры или определенные пользователем функции в индексных выражениях

Вы можете поднять мощность индексов, путем ссылки на хранимые процедуры или включением ваших собственных функций (UDF) в индексное выражение.

NoteЗамечание

Примите во внимание некоторые соображения при включении UDF в индексное выражение. Ссылка на хранимые процедуры или использование UDF в индексном выражении увеличивает время создания индекса. Для получения более подробной информации смотрите Соображения по составлению инддексных выражений.

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

Использование в индексных выражениях полей, допускающих Null значения

Вы можете создать индексы на полях, которые допускают null значения. Visual FoxPro вставляет индексные выражения, которые оцениваются в пусто (.NULL.) в компактный индекс (.cdx) или отдлеьный индексный (.idx) файл, впереди индексный выражений, которые не оцениваются в null. Поэтому все null значения появляются в начале индекса.

Например, привепденный ниже рисунок демонстрирует эффект индексирования null значений. До применения индекса, первый рисунок показывает поле Social Security для третьей и пятой записи, которые содержат null (.NULL.) значения, что говорит о том, что номера Social Security либо неизвестны, либо недоступны.

Null значения имеются в двух записях поля SocSec.

FoxPro Table Example

Приведенный ниже пример создает индекс, используя индексное выражение, содержащее поле Social Security:

  CopyCode imageСкопировать код
INDEX ON SocSec + LastName + FirstName TAG MyIndex

Когда вы примените такой индекс, в таблице первыми отобразятся те записи, которые содержат пустые значения для номеров Social Security, упорядоченные по фамилии в убывающем порядке, за которыми следуют оставшиеся записи, упорядоченные по номеру Social Security number.

NoteЗамечание

В этой таблице имеется два значения Alan Carter. Однако, поскольку  в записи номер 5 содержится null значение, то эта запись - с номером 5 индексируется до записи с номером 2.

Записи, которые содержат null-значения в поле SocSec появляются первыми.

FoxPro Example Table Null

Смотрите также