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

Использование индексов

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

Если записи в таблице содержат уникальные ключи, то создайте для ключевого поля первичный индекс или индекс-кандидат. Эти типы индексов позволяют Visual FoxPro проверять правильность ключей на низком уровне (без программирования), что обеспечивает наибольшую производительность.

Дополнительно к индексированию полей, используемых для поиска и сортировки, вы должны проиндексировать поля, включенные в операцию объединения (join) таблиц. Если вы объединяете две таблицы с помощью неиндексированных полей, то такая операция может потребовать на свое выполнение в сотни раз больше времени.

Важной особенностью Visual FoxPro является возможность создания индекса по любому выражению. (В некоторых системах управления базами данных допускаются индексы только по полям). Эта возможность позволяет вам применять индексы для оптимизации поиска, сортировки и операций объединения, используя комбинации полей или формируя из полей выражения. Например, вы можете индексировать поле Имени, базирующееся на выражении, использующем функцию SOUNDEX( ). Таким способом ваше приложение может обеспечить быстрый доступ к именам, которые звучат одинаково.

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

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

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

Оптимизация операций объединения (Joins)

При создании объединений с помощью команды SELECT - SQL следующие ситуации могут снизить производительность и привести к непредсказуемым результатам:

  • При объединении таблиц, у одной из них отсутствует первичный или уникальный ключ.

  • Объединяемые таблицы содержат незаполненные поля.

Для того, чтобы избежать этих ситуаций, создайте объединения, основанные на отношении между первичными ключами в одной таблице и внешними ключами в другой. Если Вы создаете объединение, основанное на данных, которые не являются уникальными, то конечный результат может может содержать все данные из обеих таблиц. Например, следующая команда SELECT - SQL создает объединение, результат которого может быть очень объемным:

  Копировать код
SELECT *;
FROM tastrade!customer INNER JOIN tastrade!orders ;
ON Customer.postal_code = Orders.postal_code

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

  Копировать код
SELECT *;
FROM tastrade!customer INNER JOIN tastrade!orders ;
ON Customer.customer_id = Orders.customer_id

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

Кроме того, проявите осмотрительность при объединении таблиц с незаполненными полями, поскольку Visual FoxPro не может сравнить поля с неопределенными (null) значениями. При создании объединения проверяйте значения полей на их обязательную заполненность.

Например, если вы предполагаете, что поле customer_id в таблице Заказов может быть пустым, то примените следующую команду SELECT - SQL, которая отфильтрует записи с клиентами без номера:

  Копировать код
SELECT *;
FROM tastrade!customer INNER JOIN tastrade!orders ;
ON Customer.customer_id = Orders.customer_id;
WHERE tastrade!orders <> ""
Заметка:
Можно, также, проверить заполненность символьного поля с помощью функции EMPTY( ), но она работает медленней, чем операция сравнения с константой.

Использование менеджера проектов

При использовании менеджера проекта вы можете объединить неограниченное количество программ и процедур в одном .app или .exe файле. Это может существенно увеличить скорость выполнения программы по двум причинам.

Во-первых, Visual FoxPro открывает программный файл и оставляет его открытым. Позднее, когда вы дадите  команду DO в программе, содержащейся в файле, Visual FoxPro не нужно будет снова открывать этот файл.

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

Более подробно о том, как использовать менеджер проектов для создания приложений, читайте в разделе Компиляция приложения.

Общие рекомендации по оптимизации таблиц и индексов

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

  • Если не включена буферизация записей или таблиц, то применяйте команду INSERT - SQL вместо пары команд APPEND BLANK и REPLACE, что особенно важно для индексированных таблиц в  многопользовательской среде, поскольку при этом индексы будут обновляться только один раз.

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

  • По возможности, избегайте вызова функций в SQL-командах, особенно в тех, которые возвращают более одной записи. Дело в том, что такие команды должны повторно вычисляться для каждой записи (при этом функции каждый раз будут вызываться снова). Если Вы создаете команду SQL с переменными данными, то используйте выражения имени или макроподстановки вместо функции EVALUATE(). Пока что, лучшей стратегией является динамическое формирование всей команды SQL, а не только его отдельных предложений (clause). Подробнее об этом смотрите в разделах Использование макросов и Создание именованных выражений.

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

  • В многопользовательской среде применяйте файлы .cdx вместо файлов .idx, потому что обновление одного файла .cdx происходит быстрее, чем нескольких файлов .idx.

См. также