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

  1. Клиент делает запрос к дистанционной базе данных.

  2. Сервер выполняет грамматический разбор и компилирует запрос.

  3. Сервер генерирует результирующий набор.

  4. Сервер уведомляет клиента о том, что готов результат запроса.

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

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

Извлечение только необходимые вам данных

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

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

  • Указывайте только необходимые вам поля. Не применяйте команд типа SELECT * FROM customers до тех пор, пока вам не понадобятся все поля таблицы.

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

  • Если при проектировании вам будет затруднительно определить какие значение использовать в предложении WHERE, то можете использовать примеры из данного раздела. Перед выполнением запроса, Visual FoxPro использует заранее определенное пользователем значение параметра переменной (с символом ?) или отображает окно с подсказкой, в котором пользователь должен ввести это значение. Например, вот этот запрос позволяет приложению или пользователю заполнять значение региона во время выполнения параметризованного запроса:

      Копировать код
    SELECT cust_id, company, contact, address ;
    FROM customers ;
    WHERE region = ?pcRegion
  • Установите свойство NoDataOnLoad соответствующего объекта Data Environment Cursor. Эта техника обычно применяется с параметризованными представлениями, в которых параметр получает свое значение от элемента управления формы.

Рациональное обновление удаленных таблиц

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

Для оптимизации процесса модификации данных в удаленном источнике данных вы можете указать как Visual FoxPro должен проверять факт изменения записей. Чтобы сделать это, вы указываете в предложении WHERE каким образом Visual FoxPro должен проводить эту модификацию.

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

  Копировать код
SELECT cust_id, company, address, contact ; 
FROM customers ;
WHERE region = ?vpRegion

Необходимо модифицировать все поля, указанные в представлении, за исключением ключевого (cust_id). Следующая таблица демонстрирует всевозможные варианты предложения WHERE, которые доступны для этого примера.

Замечание:
Функция OLDVAL( ) возвращает значение поля до модификации, а функция CURVAL( ) - текущее значение поля из удаленного источника данных. Сравнивая эти значения, Visual FoxPro определяет была ли кем-либо изменена запись на удаленном источнике данных с тех пор, как вы загрузили ее на свой компьютер.

Установочные параметры Результирующее предложение WHERE

Key fields only (Только ключевое поле)

WHERE OLDVAL(cust_id) = CURVAL(cust_id)

Key and updatable fields (Ключевое поле и поля, которые могут быть модифицированы) (по умолчанию) 

WHERE OLDVAL(cust_id) = CURVAL(cust_id) AND

OLDVAL(<mod_fld1>) = CURVAL(<mod_fld2>) AND

OLDVAL(<mod_fld2>) = CURVAL(<mod_fld2>) AND

...

Key and modified fields (Ключевое и уже модифицированные поля)

WHERE OLDVAL(cust_id) = CURVAL(cust_id) AND

OLDVAL(company) = CURVAL(company) AND

OLDVAL(contact) = CURVAL(contact) AND

OLDVAL(address) = CURVAL(address)

Key and timestamp (Ключевое поле и время создания/модификации полей)

WHERE OLDVAL(cust_id) = CURVAL(cust_id) AND

OLDVAL(timestamp) = CURVAL(timestamp)

Вообще говоря, вы должны придерживаться следующего порядка при выборе вариантов предложения SQL WHERE:

  1. Key and timestamp, если удаленная база данных поддерживает опцию "время создания/модификации полей", то это самый быстрый способ проверить изменилась запись или нет.

  2. Key and modified fields, поскольку поля, которые вы модифицирует на сервере, почти всегда являются подмножеством совокупности полей, которые необходимо модифицировать.

  3. Key and updatable fields.

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

Пересылка команд в пакете

Сервера, подобные Microsoft SQL Server, позволяют передать им группу SQL-команд в одном пакете. Это ускоряет их выполнение, потому-что, во-первых, снижается сетевой трафик и, во-вторых, сервер может компилировать несколько предложений за один раз.

Например, если вы хотите модифицировать 10 записей в удаленной базе данных четырьмя SQL-командами, то Visual FoxPro передаст их в одном пакете:

  Копировать код
UPDATE customer SET contact = "John Jones" ; 
WHERE cust_id = 1;
UPDATE customer SET contact = "Sally Park" ;
WHERE cust_id = 2;
UPDATE customer SET company = "John Jones" ;
WHERE cust_id = 3;
UPDATE customer SET contact = "John Jones" ;
WHERE cust_id = 4
Для того, чтобы послать несколько команд в одном пакете, необходимо:
  1. В диалоговом окне Options выбрать закладку Remote Data, а затем в поле  Records to batch update указать количество включаемых в пакет записей.

    или

  2. Вызвать функцию DBSETPROP( ) или CURSORSETPROP( ), чтобы установить ее свойства:

    • Установите Transaction равным 2.

    • Установите BatchUpdateCount равным количеству команд, посылаемых в пакете.

      или
  1. В конструкторе представлений (View Designer) выберите в меню Query пункт Advanced Options, чтобы отобразить диалоговое окно Advanced Options.

  2. В области Performance укажите в поле Number of records to batch update количество команд, посылаемых в пакете.

    Замечание:
    Для оптимизации модификаций вы должны поэксперементировать с различными значениями вышеприведенных свойств, а также свойства PacketSize.

Регулировка размера пакета

Чтобы оптимизировать доступ к удаленным серверам необходимо отрегулировать размер сетевых пакетов, посылаемых и принимаемых из удаленных баз данных. Например, если ваша сеть поддерживает пересылку пакетов большого размера (больше чем 4096 байтов), то вы можете увеличивать размер пакета для того, чтобы пересылать больше данных всякий раз, когда принимаете или посылаете данные по сети.

Для регулировки размера пакета необходимо
  1. Вызвать функцию DBSETPROP( ) или CURSORSETPROP( ) присвоить свойству PacketSize положительное целое значение. Умалчиваемое значение равно 4096.

    Замечание:
    Различные сетевые провайдеры оперирую с этим свойством по разному, поэтому за деталями вы должны обратиться к сетевой сервисной документации. Для Novell NetWare, например, максимальный размер пакета равен 512 байтам, поэтому присвоение свойству PacketSize большего значения не принесет никакой выгоды.

Задержка в получении мемо и двоичных данных

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

Для тог, чтобы задержать получение мемо или двоичных данных вы должны:
  1. В диалоговом окне Options выбрать закладку Remote Data, а затем в поле Remote view defaults установить значение Fetch memo.

    или

  2. Вызвать функцию DBSETPROP( ) или CURSORSETPROP( ) для установки свойства FetchMemo.

Локальное хранение данных для поиска

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

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

Создание локальных правил

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

Определяя правила в Visual FoxPro, вы перехватываете неправильные данные прежде, чем они будут посланы по сети, что увеличит производительность последней и позволит вам улучшить обработку ошибок. Тем не менее, использование локальных правил не отменяет их согласование их с правилами удаленного сервера. Например, если произошло изменение каких-либо правил на сервере, то необходимо изменить и соответствующие им локальные правила.

Подробнее об этом смотрите в разделе Руководство: Создайте правила проверки достоверности для представлений

См. также