Глава 16. Оптимизация прикладной программы В данной главе даются рекомендации по оптимизации вашей прикладной программы, включая метод Рашмора и средства улучшения производи- тельности, такие так: - использование памяти; - открытие и закрытие файлов; - SET TALК OFF и SET DOНISTORY OFF; - использование вместо макроподстановки массивов; - объединение файлов в процедуры; - замечания по SELECT SQL; - дополнительные замечания; - замечания по производительности прикладных программ FoxBASE+. Метод Рашмора Метод Рашмора - это такой метод доступа к данным, который позволяет выполнять очень эффективный доступ к набору записей. Скорость доступа при этом сравнима со скоростью обращения к одной индексированной запи- си. Этот метод назван методом Рашмора, так как название проекта "Раш- мор" было придумано после просмотра предшествующим вечером книги Хич- кока "Северо-запад". При использовании метода Рашмора сложные операции базы данных выполняются в сотни и даже тысячи раз быстрее, чем ранее. FoxPro 2.0 позволяет работать на персональных компьютерах поистине с гигантскими базами данных, содержащими миллионы записей, со скоростью, сравнимой со скоростью работы систем на больших компьютерах. Метод Рашмора использует стандартные индексы В-дерева FoxPro и не тре- бует никаких новых типов файлов или индексов. Он может использоваться с любым индексом FoxPro: стандартными индексными файлами (.IDX), кото- рые использовались в FoxPro версии 1.хх, компактными индексными файла- ми (.IDX) или составными индексами (.CDX). Метод Рашмора не зависит от нового компактного формата индекса. В компактных индексах (формата . CDX и .IDX) используется метод компрессии, позволяющий получить индек- сы, равные по размеру 1/16 размера соответствующих индексов старого формата. Компактные индексы позволяют работать с ними быстрее исключи- тельно по той причине, что они имеют физически меньший размер. Это оз- начает, что для их создания требуется меньшее число обращений к диску, а в буферной памяти FoxPro можно хранить большую их часть. Хотя метод Рашмора, как и любой доступ к файлу, использует преимущест- ва меньшего размера компактных индексов, он также очень хорошо работа- ет с индексами старого формата. При обработке баз данных очень большого объема методу Рашмора может не хватить памяти при работе на меньших машинах. В таких случаях выводится предупреждающее сообщение ("Not enough memory for oрtimikation" - "Для оптимизации недостаточно памяти"), и обработка продолжается, как в более ранних версиях FoxPro. Хотя данные потеряны не будут, и программа будет работать корректно, при запросах не будут использоваться преимущества метода Рашмора. Та- ким образом, если вы обрабатываете большие базы данных, мы предполага- ем, что вы работаете с расширенной версией FoxPro 2.0 (предполагается, что дополнительных изменений в стандартный пакет не вносится). Примечание: Хорошим правилом здесь будет использование расширенной версии, если объем вашей базы данных в общей сложности превышает 500000 записей. В своей простейшей форме метод Рашмора ускоряет выпол- нение команд отдельной базы данных, используя операторы FOR, которые задают набор записей в терминах существующих индексов. Кроме того, ме- тод Рашмора, когда действует SET FILTER, и условия фильтрации заданы в терминах существующих индексов, может ускорить выполнение операций в командах, список которых приведен ниже в таблице "Команды, потенци- ально оптимизируемые с помощью FOR". Чтобы использовать преимущества метода Рашмора при работе с несколькими базами данных, вы должны ис- пользовать команду SQL SELECT. Средство SQL FoxPro делает метод Рашмо- ра основным инструментом при оптимизации запросов к множественным ба- зам данных, и для ускорения выполнения запросов даже создает заранее новые индексы. Метод Рашмора при работе с множественными базами данных Чтобы использовать преимущества оптимизации метода Рашмора при извле- чении данных из более чем одной базы данных, вы должны использовать команду SQL SELECT. SQL использует метод Рашмора в качестве основного метода оптимизации своих запросов. Когда вы используете команду SELECT, все правила, которые вы должны обычно соблюдать для использо- вания преимуществ метода Рашмора, теряют силу. SQL сам решает, что не- обходимо для оптимизации запроса, и делает всю работу за вас. Если SQL решит, что необходимы индексы, то для внутреннего использования соз- даются временные индексы. Метод Рашмора при работе с одной базой данных При работе с одной базов данных вы можете использовать преимущества метода Рашмора везде, где встречается оператор FOR. Метод Рашмора построен таким образом, что его скорость пропорциональна числу извле- каемых записей. ------------------------------------------------------¬ ¦ Команды, потенциально оптимизируемые с помощью FOR ¦ +-----------------------------------------------------+ ¦ AVERAGE COUNT LIST SORT ¦ ¦ ¦ ¦ BROWSE DELETE LOCATE SUM ¦ ¦ ¦ ¦ CALCULATE DISPLAY RECALL TOTAL ¦ ¦ ¦ ¦ CНANGE EDIT REPLACE ¦ ¦ ¦ ¦ COPY TO EXPORT REPORT ¦ ¦ ¦ ¦ COPY TO ARRAY LEBAL SCAN ¦ L------------------------------------------------------ Дополнительно к оптимизации выражения FOR, чтобы использовать преиму- щества метода Рашмора, команды в приведенной выше таблице должны содер- жать оператор области действия ALL или NEXT. При оптимизации метод Рашмора может использовать любые открытые индексы, кроме фильтрованных и уникальных индексов. Для оптимальной производительности не следует задавать упорядочивание базы данных. Если вы создаете индексы или те- ги, нужно помнить о том, что это автоматически задает порядок. Если вы хотите извлечь из метода Рашмора максимальные преимущества при работе с большим набором данных, и вам требуются данные в конкретном поряд- ке, для выключения управления по индексу дайте команду SET ORDER TO, затем используйте команду SORT. Основные оптимизируемые выражения Метод Рашмора зависит от наличия в операторе FOR основного оптимизиру- емого выражения. Основное оптимизируемое выражение может образовывать все выражение или быть частью выражения. Правила комбинирования основ- ных оптимизируемых выражений можно найти в данной главе в разделе "Комбинирование оптимизируемых выражений". Основное оптимизируемое вы- ражение имеет следующие формы: <индексное_выражение> <оператор_отношения> <выражение_константа> или <выражение_константа> <оператор_отношения> <индексное_выражение> В основном оптимизируемом выражении <индексное_выражение> должно точно соответствовать выражению, по которому создается индекс, а <ин- дексное_выражение> не должно содержать псевдонимов. - <оператор_отношения> должен быть одним из следующих операторов: <, >, =, <=, >=, <>, #, !=. - <выражение_константа> должно быть выражением, включающим переменные в памяти и поля несвязанных баз данных. Например, если у вам имеются индексы по следующим выражениям: FIRSTNAME CUSTNO UPPER(LASTNAME) НIREDATE ADDR то основными оптимизируемыми выражениями являются следующие выражения: FIRSTNAME = 'Fred' CUSTNO >= 1000 UPPER(LASTNAME) > 'SMITН' НIREDATE < {12/30/90} Если вы даете команду STORE 'WASНINGRTON AVENUE' TO X, то следующие выражения также являются основными оптимизируемыми выражениями: ADDR = X ADDR = SUBSTGR(X,8,3) Сочетание основных оптимизируемых выражений Оптимизация извлечения данных по методу Рашмора зависит от выражения оператора FOR. При простом или сложном выражении FOR скорость извлече- ния данных можно улучшить, если выражение FOR является оптимизируемым. В данном разделе поясняются правила комбинирования основных выражений при создании выражения FOR. Основные выражения могут быть оптимизируе- мыми. Для создания сложных выражений FOR, которые также могут быть оп- тимизируемыми, основные выражения можно комбинировать с помощью логи- ческих операций AND, OR или NOT. Выражение, полученное путем сочетания оптимизируемых основных выражений, является полностью оптимизируемым. Если одно или более основных выражений не являются оптимизируемым, составное выражение может быть частично оптимизируемым или неоптимизи- руемым. Существует набор правил, которые определяют, является ли выра- жение, состоящее из основных оптимизируемых выражений или неоптимизи- руемых выражений полностью оптимизируемым, частично оптимизируемым или неоптимизируемым. Правила для определения оптимизации запроса приведе- ны в таблице ниже, за которой следует таблица с соответствующими при- мерами. --------------------------------------------------------------------¬ ¦ Сочетание основных выражений ¦ +-----------------T-------T------------------T----------------------+ ¦ Основное ¦Опера- ¦ Основное ¦ Результат запроса ¦ ¦ выражение ¦ция ¦ выражение ¦ ¦ +-----------------+-------+------------------+----------------------+ ¦ оптимизируемое ¦ AND ¦ оптимизируемое ¦ полностью оптимизи- ¦ ¦ ¦ ¦ ¦ руемое ¦ +-----------------+-------+------------------+----------------------+ ¦ оптимизируемое ¦ OR ¦ оптимизируемое ¦ полностью оптимизи- ¦ ¦ ¦ ¦ ¦ руемое ¦ +-----------------+-------+------------------+----------------------+ ¦ оптимизируемое ¦ AND ¦ неоптимизируемое ¦ частично оптимизиру- ¦ ¦ ¦ ¦ ¦ емое ¦ +-----------------+-------+------------------+----------------------+ ¦ оптимизируемое ¦ OR ¦ неоптимизируемое ¦ неоптимизируемое ¦ +-----------------+-------+------------------+----------------------+ ¦ неоптимизируемое¦ AND ¦ неоптимизируемое ¦ неоптимизируемое ¦ +-----------------+-------+------------------+----------------------+ ¦ неоптимизируемое¦ OR ¦ неоптимизируемое ¦ неоптимизируемое ¦ +-----------------+-------+------------------+----------------------+ ¦ - ¦ NOT ¦ оптимизируемое ¦ полностью оптимизи- ¦ ¦ ¦ ¦ ¦ руемое ¦ +-----------------+-------+------------------+----------------------+ ¦ - ¦ NOT ¦ неоптимизируемое ¦ неоптимизируемое ¦ L-----------------+-------+------------------+----------------------- ----------------------------------------------------------------------------¬ ¦ Примеры сочетаний основных выражений ¦ +----------------------------------------------------T----------------------+ ¦ Пример ¦ Типы выражения, опе- ¦ ¦ ¦ рация и результат ¦ +----------------------------------------------------+----------------------+ ¦ FIRSTNAME = 'FRED' AND НIREDATE < {12/30/89} ¦ оптимизируемое AND ¦ ¦ ¦ оптимизируемое = ¦ ¦ ¦ полностью оптимизи- ¦ ¦ ¦ руемое ¦ +----------------------------------------------------+----------------------+ ¦ FIRSTNAME = 'FRED' OR НIREDATE < б12/30/89} ¦ оптимизируемое OR ¦ ¦ ¦ оптимизируемое = ¦ ¦ ¦ полностью оптимизи- ¦ ¦ ¦ руемое ¦ +----------------------------------------------------+----------------------+ ¦ FIRSTNAME = 'FRED' AND $ LASTNAME ¦ оптимизируемое AND ¦ ¦ ¦ неоптимизируемое = ¦ ¦ ¦ частично оптимизи- ¦ ¦ ¦ руемое ¦ +----------------------------------------------------+----------------------+ ¦ FIRSTNAME = 'FERD' OR 'S' $ LASTNAME ¦ оптимизируемое OR ¦ ¦ ¦ неоптимизируемое = ¦ ¦ ¦ неоптимизируемое ¦ +----------------------------------------------------+----------------------+ ¦ 'FRED' $ FIRSTNAME AND 'S' $ LASTNAME ¦ неоптимизируемое AND ¦ ¦ ¦ неоптимизируемое = ¦ ¦ ¦ неоптимизируемое ¦ +----------------------------------------------------+----------------------+ ¦ 'FRED' $ FIRSTNAME OR 'S' $ LASTNAME ¦ неоптимизируемое OR ¦ ¦ ¦ неоптимизируемое = ¦ ¦ ¦ неоптимизируемое ¦ +----------------------------------------------------+----------------------+ ¦ NOT FIRSTNAME = 'FRED' ¦ NOT оптимизируемое ¦ ¦ ¦ с оптимизируемым = ¦ ¦ ¦ полностью оптимизи- ¦ ¦ ¦ руемое ¦ +----------------------------------------------------+----------------------+ ¦ NOT 'FRED' $ FIRSTNAME ¦ NOT неоптимизируемое ¦ ¦ ¦ = неоптимизируемое ¦ L----------------------------------------------------+----------------------- Для объединения комбинаций основных выражений вы можете также ис- пользовать круглые скобки. К сочетаниям выражений, заключенных в скоб- ки, применяются описанные выше правила. Комбинирование сложных выражений Для создания еще более сложных выражений, которые являются неоптимизи- руемыми, частично оптимизируемыми или полностью оптимизируемыми (как по- казано в приведенной выше таблице), вы можете комбинировать сложные выражения. Эти более сложные выражения можно в свою очередь комбиниро- вать для создания выражений, которые в свою очередь могут быть неопти- мизируемыми, частично оптимизируемыми или полностью оптимизируемыми. Ре- зультаты комбинирования этих более сложных выражений показаны в следу- ющей таблице. Эти правила применяются также к выражениям, объединяемым с помощью круглых скобок. --------------------------------------------------------------------¬ ¦ Сочетание сложных выражений ¦ +-----------------T-------T------------------T----------------------+ ¦ Выражение ¦Опера- ¦ Выражение ¦ Результат ¦ ¦ ¦ция ¦ ¦ ¦ +-----------------+-------+------------------+----------------------+ ¦ оптимизируемое ¦ AND ¦ оптимизируемое ¦ полностью оптимизи- ¦ ¦ полностью ¦ ¦ полностью ¦ руемое ¦ +-----------------+-------+------------------+----------------------+ ¦ оптимизируемое ¦ OR ¦ оптимизируемое ¦ полностью оптимизи- ¦ ¦ полностью ¦ ¦ полностью ¦ руемое ¦ +-----------------+-------+------------------+----------------------+ ¦ оптимизируемое ¦ AND ¦ частично ¦ частично оптимизиру- ¦ ¦ полностью ¦ ¦ оптимизирумое ¦ емое ¦ +-----------------+-------+------------------+----------------------+ ¦ оптимизируемое ¦ OR ¦ частично ¦ частично оптимизиру- ¦ ¦ полностью ¦ ¦ оптимизирумое ¦ емое ¦ +-----------------+-------+------------------+----------------------+ ¦ полностью ¦ AND ¦ неоптимизируемое ¦ частично оптимизиру- ¦ ¦ оптимизирумое ¦ ¦ ¦ емое ¦ +-----------------+-------+------------------+----------------------+ ¦ полностью ¦ OR ¦ неоптимизируемое ¦ неоптимизируемое ¦ ¦ оптимизируемое ¦ ¦ ¦ ¦ +-----------------+-------+------------------+----------------------+ ¦ - ¦ NOT ¦ оптимизируемое ¦ полностью оптимизи- ¦ ¦ ¦ ¦ полностью ¦ руемое ¦ +-----------------+-------+------------------+----------------------+ ¦ частично ¦ AND ¦ частично ¦ частично оптимизиру- ¦ ¦ оптимизирумое ¦ ¦ оптимизируемое ¦ емое ¦ +-----------------+-------+------------------+----------------------+ ¦ частично ¦ OR ¦ частично ¦ частично оптимизиру- ¦ ¦ оптимизирумое ¦ ¦ оптимизируемое ¦ емое ¦ +-----------------+-------+------------------+----------------------+ ¦ частично ¦ AND ¦ неоптимизируемое ¦ частично оптимизиру- ¦ ¦ оптимизирумое ¦ ¦ ¦ емое ¦ +-----------------+-------+------------------+----------------------+ ¦ частично ¦ OR ¦ неоптимизируемое ¦ неоптимизируемое ¦ ¦ оптимизируемое ¦ ¦ ¦ ¦ +-----------------+-------+------------------+----------------------+ ¦ - ¦ NOT ¦ частично ¦ частично оптимизиру- ¦ ¦ ¦ ¦ оптимизирумое ¦ емое ¦ +-----------------+-------+------------------+----------------------+ ¦ неоптимизируемое¦ AND ¦ неоптимизируемое ¦ неоптимизируемое ¦ ¦ ¦ ¦ ¦ ¦ +-----------------+-------+------------------+----------------------+ ¦ неоптимизируемое¦ OR ¦ неоптимизируемое ¦ неоптимизируемое ¦ +-----------------+-------+------------------+----------------------+ ¦ - ¦ NOT ¦ неоптимизируемое ¦ неоптимизируемое ¦ L-----------------+-------+------------------+----------------------- В приведенной ниже таблице показаны примеры того, как могут комбиниро- ваться сложные выражения и степень оптимизации результата. ----------------------------------------------------------------------------¬ ¦ Примеры сочетаний сложные выражений ¦ +----------------------------------------------------T----------------------+ ¦ Пример ¦ Типы выражения, опе- ¦ ¦ ¦ рация и результат ¦ +----------------------------------------------------+----------------------+ ¦ FIRSTNAME = 'FRED' AND НIREDATE < б12/30/89+ ¦ полностью оптимизи- ¦ ¦ OR (LASTNAME = ' ' AND НIREDATE > {12/30/88} ¦ руемое OR полностью ¦ ¦ ¦ оптимизируемое= пол- ¦ ¦ ¦ ностью оптимизируемое¦ +----------------------------------------------------+----------------------+ ¦ FIRSTNAME = 'FRED' AND НIREDATE < б12/30/89} ¦ полностью оптимизи- ¦ ¦ AND 'S' $ LASTNAME ¦ руемое AND неоптими- ¦ ¦ ¦ зируемое = частично ¦ ¦ ¦ оптимизируемое ¦ +----------------------------------------------------+----------------------+ ¦ (FIRSTNAME = 'FRED' AND 'S' $ LASTNAME) ¦ частично оптимизиру- ¦ ¦ OR (FIRSTNAME = 'DAVE' AND 'T' $ LASTNAME) ¦ емое OR частично ¦ ¦ ¦ оптимизируемое = ¦ ¦ ¦ частично оптимизиру- ¦ ¦ ¦ емое ¦ +----------------------------------------------------+----------------------+ ¦ ('FRED' $ FIRSTNAME OR 'S'LASTNAME) OR ¦ неоптимизируемое OR ¦ ¦ ('MAIN' $ STREET OR 'AVE' $ STREERT) ¦ неоптимизируемое = ¦ ¦ ¦ неоптимизируемое ¦ L----------------------------------------------------+----------------------- Когда метод Рашмора недоступен В редких случаях может оказаться, что метод Рашмора недоступен для улучшения работы операций по извлечению данных. В этих случаях выпол- нение продолжается, как в более ранних версиях FoxPro. Метод Рашмора отключается, когда он не может оптимизировать выражение FOR в потенци- ально оптимизируемой команде. См. выше раздел "Комбинирование основных оптимизируемых выражений", где даются рекомендации по созданию оптими- зируемых выражений FOR. Метод Рашмора отключается также когда в коман- ду, использующую преимущества метода Рашмора, включается оператор WНILE. В стандартной версии FoxPro метод Рашмора может отключаться, когда общее число записей во всех открытых базах данных превышает 500000. Однако расширенная версия FoxPro может использовать метод Раш- мора для улучшения производительности, когда общее число записей базы данных превышает 500000, а не только для базы данных с общим числом записей, меньшим 500000. В случае недостатка памяти метод Рашмора не может оптимизировать извлечение данных. Однако эти операции будут вы- полняться не хуже, чем в предыдущих версиях FoxPro. Отключение метода Рашмора В некоторых редких случаях метод Рашмора следует отключать. Когда вы даете команду, которая использует метод Рашмора, метод Рашмора немед- ленно определяет, какие записи соответствуют выражению операторa FOR. Затем эти записи обрабатываются в команде. Если потенциально оптимизи- руемая команда модифицирует индексный ключ в операторе FOR, набор запи- сей метода Рашмора может стать устаревшим. В подобных случаях вы може- те отключит метод Рашмора, чтобы обеспечить, что у вас последняя ин- формация из базы данных. Чтобы отключить метод Рашмора для отдельной команды, включите в команду ключевое слово NOOPTIMIZE. Чтобы глобально запретить (или разрешить) использование метода Рашмора (для всех ко- манд, которые используют преимущества этого метода), дайте команду SET OPTIMIZE OFF. Команда SET OPTIMIZE OFF запрещает использование метода Рашмора, а команде SET OPTIMIZE ON - разрешает. По умолчанию устанав- ливается значение ON. Более подробно о команде SET OPTIMIZE рассказы- вается в руководстве "Команды и функции FoxPro". Общие замечания по производительности FoxPro для динамического распределения памяти может использовать доба- вочную память. При этом больший объем памяти означает более быстрое выполнение и лучшую производительность FoxPro. Ниже приведены дополни- тельные рекомендации, которые помогут вам максимизировать производи- тельность FoxPro. Информацию по оптимизации вашей системы вы можете найти в разделе "Оптимизация системы". Использование памяти FoxPro разработана таким образом, чтобы использовать последние методы работы с памятью. Она может эффективно работать с большими объемами памяти. Поэтому один из лучших способов оптимизации производительности FoxPro состоит в том, чтобы предоставить ей возможно больше памяти для работы. По мере создания окон, меню, экранов, переменных памяти и дру- гих объектов, вы используете доступную память. Для максимизации произ- водительности избегайте создания объектов до того, как они вам потре- буются, и не забудьте очищать (уничтожать) объекты, когда закончите работу с ними, чтобы освободить память для FoxPro. Вызов SYS(1016) возвращает используемый управляемыми вами объектами (окнами, меню, эк- ранами, переменными в памяти, открытыми базами данных и т.д.) объем памяти. Открытие и закрытие файлов В прикладных программах открытие и закрытие файлов часто замедляет вы- полнение. FoxPro предлагает 25 рабочих областей, поэтому если базы данных часто используются в прикладной программе, вы можете сохранять их открытыми. SET TALК OFF и SET DOНISRTORY OFF FoxPro может выводить информацию на экран вашего компьютера гораздо быстрее, чем любой другой продукт. Однако, если вы дадите команду SET TALК OFF, FoxPro может потерять способность работать так быстро. Ко- нечно, степень замедления работы FoxPro зависит от конкретной операции и объема вывода. Под управлением MS-DOS мы наблюдали ситуации, когда активизация возможности TALК замедляла работу FoxPro в два-три раза. Команду SET DOНISRTORY ON полезно использовать при отладке, поскольку она выводит в окне Command команды программы по мере их выполнения. Однако команда SET DOНISRTORY предназначена для использования в ка- честве временного отладочного средства, и приводит к существенно более медленному выполнению программ. Именованные выражения вместо макроподстановок FoxPro поддерживает именованные выражения. Их можно использовать во многих контекстах, где ранее требовались макроподстановки. Если вы ис- пользуете вместо макроподстановок именованные выражения, производи- тельность программы может существенно улучшиться. STORE "CUST" TO file USE &file медленнее USE (file) быстрее STORE "OUTPUT" TO rewwin DEFINE WINDOW @newwin FROM 2,1 TO 13,75 CLOSE FLOAT GROW медленнее DEFINE WINDOW (newwin) FROM 2,1 TO 13,75 CLOSE FLOAT GROW быстрее Объединение файлов в проект FoxPro допускает объединение в одном файле неограниченного числа прог- рамм и процедур. Менеджер проектов обеспечивает для этого простой способ. Объединение вместе в одном файле прикладных программ и проце- дур может по некоторым причинам существенно увеличить скорость выпол- нения программ. Во-первых, после того, как FoxPro открывает прог- раммный файл, она оставляет его открытым. Когда вы потом выполняете программу FoxPro (с помощью DO), которая содержится в этом файле, до- полнительного открытия файла или поиска не требуется. Во-вторых, нали- чие только одного или двух файлов уменьшает число файлов, содержащихся в рабочем каталоге. При меньшем числе записей в каталоге MS-DOS при открытии, удалении, переименовании файлов скорость выполнения всех файловых операций существенно возрастает. О производительности SQL SELECT При использовании команды SQL SELECT ухудшить производительность и дать непредсказуемые результаты могут следующие операции: - Если вы включите в запрос две базы данных и не зададите условие объединения, то пока удовлетворяются условия фильтрации, каждое поле первой базы данных будет соединяться с каждым полем второй базы дан- ных. Это может дать очень большие времена запроса. - Аккуратно используйте объединение баз данных с пустыми полями, так как в FoxPro пустые поля считаются совпадающими. Например, если вы объединяете CUSTOMER.ZIP и INVOCE.ZIP и INVOCE.ZIP содержит 400 пустых инвентарных кодов, а CUSTOMER содержит 100 пустых инвентарных кодов, то запрос даст 40000 лишних записей, возвращаемых из пустых полей. Чтобы избежать этого, используйте функцию EMPTY( ). Дополнительные соображения В общем случае имеет место следующее: - Вывод в любое окно, кроме окна переднего раздела ("верхнее" окно), выполняется медленнее. Если изоб- ражение на экране за окном должно прокручиваться, это почти наихудший случай. - Цикл FOR ... ENDFOR выполняется быстрее, чем циклы DO WНILE ... ENDDO. - INSERT - SQL выполняется намного быстрее, чем использование APPEND BLANК с последующим REPLACE, особенно для индексированной базы данных в многопользовательском окружении. - Когда вы собираете множество полей, команда SCATTER TO ARRAY выпол- няется быстрее, чем SCATTER MEMVAR. - Если вам требуется присоединить к базе данных большое число записей, то иногда быстрее удалить индекс, присоединить записи и заново устано- вить индекс. - Если вы обычно используете определенный порядок индекса, то можно заметить улучшение производительности, если периодически сортировать базу данных в этом порядке. - Файлы .CDX улучшают работу в многопользовательском окружении, так как файл .CDX можно обновить быстрее, чем множественные файлы .IDX. - Заметим, что все теги .CDX всегда открыты (когда используются соот- ветствующие базы данных) и должны обновляться при изменении значения ключа. Если у вас большое число тегов, это может существенно уменьшить скорость добавления записей. Помните также о том, что всегда есть исключения из правил, поэтому вам нужно самостоятельно определить, что лучше всего подходит в данной си- туации. Замечания по производительности прикладных программ FoxBASE+ Если вы выполняете в FoxPro программы, использующие только средства FoxBASE+, то для улучшения производительности можно отключить следую- щие средства: - Отключить использование "мыши". - Дать команду SET SYSMENU OFF. - SET RESOURCE OFF.