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

Кроме того, вы можете использовать свойство представления UseMemoSize для возврата символьных полей в виде мемо-полей и затем переключить FetchMemo в "off", что позволит вашему приложению выборочно извлекать такие символьные поля, преобразованные в мемо-поля.

Использование прогрессивного извлечения (Progressive Fetching)

Когда вы запрашиваете удаленный источник данных, Visual FoxPro извлечает все строки данных и создает курсор Visual FoxPro. Для увеличения скорости извлечения удаленных данных, Visual FoxPro выполняет прогрессивное извлечение курсоров представления и курсоров, создаваемых асинхронно с помощью технологии SQL pass-through. Вместо того, чтобы потребовать от вас или вашего представления ожидания во времени, пока будет извлечен полный набор данных, Visual FoxPro исполняет запрос и извлекает только небольшой поднабор полного набора строк результа в локальный курсор. По умолчанию, размер такого поднабора равен 100 строкам.

NoteЗамечание

Синхронные команды SQL pass-through не используют прогрессивное извлечение. До того, как управление будет передано обратно вашему приложению, команда SQLEXEC( ) извлекает полный набор результатов.

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

NoteЗамечание

Увеличение числа извлекаемых строк повышает производительность, но уменьшает "отзывчивость" интерефейса пользователя. Уменьшение номер извлекаемых строк имеет обратный эффект.

Извлечение данные по требованию (On Demand)

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

Свойство FetchAsNeeded по умолчанию установлено в false (.F.), что означает, что по умолчанию выполняется прогрессивное извлечение. Когда вы установите значение свойства FetchAsNeeded в true (.T.), строки будут извлекаться только тогда, когда они будут нужны. Когда значение свойства FetchAsNeeded установлено в true, вы не можете производить обновление до тех, пока либо не завершится извлечение, либо пока вы не вызовите функцию SQLCANCEL( ) на текущем дескрипторе соединения или не закроете представление.

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

Управление извлечением курсора

Если вы желаете извлечь курсор полностью, вы можете выдать команду GOTO BOTTOM или любую команду, которая обращается к полному набору данных.

NoteСовет

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

Программы не обеспечивают обработку цикла ожидания. Для программного извлечения курсоров представления, используйте команды GO nRecordNumber или GOTO BOTTOM. Для извлечения курсора, создаваемого в асинхронном режиме сквозным запросом (SQL pass-through), вызовите асинхронную функцию SQL pass-through для каждого поднабора результатов.

Прекращение предложения SQLEXEC()

Вы можете использовать функцию SQLCANCEL() для прекращения предложения SQLEXEC() или представления в любое время. Однако, если сервер имеет полностью завершенный удаленный набор результатов и Visual FoxPro начал процесс извлечения удаленного набора результатов в локальный курсор, функция SQLCANCEL( ) прекратит исполнение предложения SQLEXEC() и оставит локальный курсор. Если вы желаете удалить локальный курсор, вы можете использовать команду USE, которая закроет курсор и прекратит извлечение данных.

Команда USE не прекращает исполнение предложения SQLEXEC(), если локальный курсор еще не был создан. Для определения - а был ли уже Visual FoxPro создан локальный курсор, вы можете вызвать функцию USED().

Управление размером извлечения данных

Вы можете управлять числом записей, извлекаемых за один раз с удаленного сервера, с помощью вашего приложения установкой свойства FetchSize на вашем представлении. Свойство FetchSize указывает - сколько записей будет извлечено в локальный курсор с удаленного сервера за один раз, через прогрессивное извлечение или вызовами асинхронных сквозных запросов (SQL pass-through). Значением по умолчанию является 100 строк.

Для управления числом извлекаемых за один раз записей в преставление

  1. в View Designer (Конструкторе представления) выберите Advanced Options (Расширенные параметры) из меню Query (Запрос). В области Data Fetching (Извлечение данных) диалогового окна Advanced Options (Расширенные параметры) используйте счетчик для установки значения для Number of Records to Fetch at a time (Число записей, извлекаемых за один раз) .

    - или -

  2. Установите свойство FetchSize с помощью функции DBSETPROP( ) для установки размера извлечения в определении представления.

    - или -

  3. Установите свойство FetchSize с помощью функции CURSORSETPROP() для установки размера извлечения активного курсора представления.

    Например, приведенный ниже код устанавливает определение представления в прогрессивное извлечение 50-ти строк за один раз в представлении Customer_remote_view:

     CopyCode imageСкопировать код
    ? DBSETPROP('Customer_remote_view', 'View', 'FetchSize', 50)

Использование задерданного извлечения мемо-полей

Хорошо разработанное приложение часто использует задержанное извлечение мемо-полей для увеличения скорости загрузки наборов результатов, которые содержат поля типа Memo или General. Задержанное извлечение мемо-полей означает, что содержимое полей типа Memo и General не загружается автоматически при загрузку набора результатов. Вместо этого, оставшиеся поля могут быть быстро загружены, а содержимое полей типа Memo и General не загружается до момента, когда вы откроете поля Memo или General для просмотра. Задержанное извлечение мемо-полей обеспечивает очень быструю загрузку строк и позволяет извлекать содержимое полей Memo или General, которое может быть очень большим только тогда, когда они действительно понадобятся пользователю.

Напоример, ваша форма может включать поле General, которое отображает картинку. Для повышения производительности вы можете использовать задержанное извлечение мемо-полей для предотвращения загрузки картинок, пока пользователь не щелкнет по кнопке "Просмотр" на вашей форме. Код, размещенный в событии Click кнопки "Просмотр" извлечет поле General и отобразит его на форме.

Для управления задержанным извлечением мемо-полей вы можете использовать свойство FetchMemo на вашем представлении или курсоре. Свойство FetchMemo указывает - будет ли извлекаться содержимое полей типа Memo или General во время загрузки строк. Значение по умолчанию является true (.T.), что означает, что поля Memo и General будут загружаться автоматически. Если ваши данные содержат большое количество информации в мемо-полях, вы сможете отметить увеличение производительности, когда установите значение свойства FetchMemo в false (.F.).

NoteЗамечание

Для того, чтобы задержанное извлечение мемо-поле могло работать, представление должно быть обновляемым, так как Visual FoxPro использует ключевые поля, устанавливаемые свойствами обновления для поиска строки источника на сервере, когда извлекаются поля типа Memo или General. Для получения информации о том, как сделать представление обновляемым, смотрите описание задачи Как: обновить данные в представлении.

Используйте функцию DBSETPROP() для установки свойства FetchMemo представления и функцию CURSORSETPROP() для установки свойства FetchMemo на курсоре.

Оптимизация производительности извлечения данных

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

 
Объект Свойство Установка

Connection

PacketSize

4K to 12K1

Connection

Asynchronous2

.F.

View

FetchSize3

максимальное значение

1. Установите более высокие значения для строк, содержащих большее количество данных; вы должны поэкспериментировать, чтобы найти наилучшие значения. 2. Используйте синхронные соединения для увеличения производительность до 50%, пока вы пожелаете иметь возможность прекращения исполнения SQL-предложений, исполняемых на сервере. 3. Эффект свойства FetchSize высоко зависим от размера записи извлекаемого набора результатов. В синхронном режиме он может значительно воздействовать на производительность. FetchSize, если снижен в размере, обеспечивает значительно лучшую "отзывчивость" интерфейса, пока производится прогрессивное извлечение представления, но снижает скорость загрузки. Если размер увеличен, он увеличивает и производительность извлечения представления.

Реальная производительность зависит в высшей степерь от конфигурации вашей системы и требований приложения.

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